2012-04-20 34 views
8

मैं इस मुद्दे को बार-बार चलाता हूं: मैं ऑब्जेक्ट्स की सूची को अन्य ऑब्जेक्ट्स की एक सूची में कैसे समूहित कर सकता हूं?मैं तत्वों की सूची से कैसे समूह कर सकता हूं?

मेरे पास A प्रकार की वस्तुओं की एक सूची है और इनमें से प्रत्येक ऑब्जेक्ट में एक संपत्ति है (इसे ListProp पर कॉल करें) जो एक सूची भी है। ListProp में B के तत्व हैं। के साथ - ListProp में ListProp गुण संदर्भ के साथ A के कई तत्व हैं, लेकिन संदर्भ संदर्भ तत्व से तत्व में भिन्न हैं। मैं इन A को सबसे बड़ा तरीका कैसे बना सकता हूं, जहां B-ListProp में ऑब्जेक्ट समान रूप से हैं?

नमूना कोड:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var exampleList = new List<A> 
     { 
      // Should be in first group 
      new A { ListProp = new List<B> 
      { 
       new B { Prop = new C { Number = 0 }}, 
       new B { Prop = new C { Number = 1 }} 
      }}, 
      // Should be in first group 
      new A { ListProp = new List<B> 
      { 
       new B { Prop = new C { Number = 0 }}, 
       new B { Prop = new C { Number = 1 }} 
      }}, 
      // Should be in second group 
      new A { ListProp = new List<B> 
      { 
       new B { Prop = new C { Number = 0 }}, 
       new B { Prop = new C { Number = 1 }}, 
       new B { Prop = new C { Number = 1 }} 
      }}, 
      // Should be in third group 
      new A { ListProp = new List<B> 
      { 
       new B { Prop = new C { Number = 0 }}, 
       new B { Prop = new C { Number = 0 }} 
      }} 
     }; 

     // Doesn't work because the reference of ListProp is always different 
     var groupedExampleList = exampleList.GroupBy(x => x.ListProp); 
    } 
} 

class C 
{ 
    public int Number { get; set; } 
    public override bool Equals(object o) 
    { 
     if (o is C) 
      return Number.Equals(((C)o).Number); 
     else 
      return false; 
    } 
} 

class B 
{ 
    public C Prop { get; set; } 
} 

class A 
{ 
    public IList<B> ListProp { get; set; } 
} 
+1

क्यों पिछले तीसरे समूह में होना चाहिए? यह पहले होना चाहिए, है ना? – abatishchev

+0

क्योंकि तत्वों की संख्या भी वही होनी चाहिए। 0,1! = 0,1,1 – germanSharper

+0

ठीक है कि अनुचित संपादन था। अभी स्पष्ट करें। – abatishchev

उत्तर

6

आप IEqualityComparer<List<B>> लागू कर सकते हैं और इसे अन्य GroupBy अधिभार में उपयोग कर सकते हैं।

public class ListOfBEqualityComparer : IEqualityComparer<List<B>> 
{ 
    public bool Equals(List<B> x, List<B> y) 
    { 
     // you can also implement IEqualityComparer<B> and use the overload 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(List<B> obj) 
    { 
     //implementation of List<T> may not work for your situation 
     return obj.GetHashCode(); 
    } 
} 

तो फिर तुम अधिभार

var groupedExampleList = exampleList.GroupBy(x => x.ListProp, 
              new ListOfBEqualityComparer()); 
उपयोग कर सकते हैं
+0

बिल्कुल सही! बहुत बहुत धन्यवाद :) मैं हमेशा इन चीजों को क्यों भूल रहा हूं: अनुक्रमिक और एक कस्टम तुलनाकर्ता का उपयोग करना। आपने मेरा दिन और विशेष रूप से मेरा सप्ताहांत बचाया;) – germanSharper

+0

आपका स्वागत है :) –

4

इस प्रयास करें:

GroupBy(x => String.Join(",", x.ListProp)); 

यह 0,1; 0,1; 0,1; 0,1,1; 0,1 द्वारा समूह तदनुसार होगा।

+0

आपके विचार के लिए धन्यवाद, लेकिन यह केवल उदाहरण के लिए काम करता है। मेरी वस्तुएं अधिक जटिल हैं, इसलिए इसे इस तरह से करना मुश्किल होगा। लेकिन एक साधारण दृष्टिकोण के लिए यह एक अच्छा विचार है। – germanSharper

+0

@germanSharper: आपको पता है कि यह किसी ऑब्जेक्ट से हैश-कोड की गणना करने जैसा लगता है (लक्ष्य यह है कि: मानदंड वस्तुओं के बराबर बराबर मान/हैश-कोड वापस करना चाहिए)। यह एक सूची या वर्ग हो सकता है। हमारे ढांचे में आम दृष्टिकोण सार्थक गुणों को सीमित करना है: "ए: बी: सी: डी:"। – abatishchev

+0

@germanSharper: इसके अलावा आप दोनों समाधानों की तुलना कर सकते हैं: कस्टम तुलनाकर्ता के अंदर आइटम को डिलीमिट/शामिल करें। मुझे समझ में आता है – abatishchev

0

मैं इस निम्नलिखित तरीके दृष्टिकोण होगा: अपनी मूल

  • समूह के साथ

    1. एसोसिएट प्रत्येक बच्चे तत्व (ListProp संपत्ति में) बच्चों द्वारा माता-पिता
    2. परिणाम

    var data = exampleList.SelectMany(a=>a.ListProp.Select(x=>new{Key = x.Prop.Number, Value = a})) 
          .GroupBy(x=>x.Key) 
          .Select(g=>new {Number = g.Key, Items = g.ToList()}); 
    
  • संबंधित मुद्दे

     संबंधित मुद्दे