2011-12-15 16 views
132

से मूल्य कैसे प्राप्त करें IGrouping और Select() विधि के बारे में मेरा कोई प्रश्न है।IGrouping

कहते हैं कि मैं इस तरह से IEnumerable<IGrouping<int, smth>> मिल गया है की सुविधा देता है:

var groups = list.GroupBy(x => x.ID); 

जहां सूची एक List<smth> है।

और अब मैं किसी तरह से एक और सूची में प्रत्येक IGrouping के मूल्यों पारित करने के लिए .:

foreach (var v in structure) 
{ 
    v.ListOfSmth = groups.Select(...); // <- ??? 
} 

किसी को भी इस तरह के संदर्भ में IGrouping<int, smth> से मूल्यों (List<smth>) प्राप्त करने के लिए कैसे बता सकते हैं की जरूरत है?

+0

आईडी आमतौर पर एक पहचान क्षेत्र है जो अनन्य होना चाहिए, जो इसके द्वारा समूह बनाना होगा बेकार, यदि आपका सिर्फ हटाने की कोशिश कर डुप्लिकेट डेटा अलग() के बजाय कोशिश है। अगर यह सूची थी। ग्रुपबी (x => x.SubID) तो समूहकरण का उपयोग करना समझ में आता है लेकिन उस स्थिति में आप समूहिंग और foreach (समूहों में var grp) रखना चाहते हैं {grp.ToList() ; } क्या होगा – MikeT

उत्तर

193

के बाद से IGrouping<TKey, TElement> लागू करता IEnumerable<TElement>, आप SelectMany सभी IEnumerables वापस IEnumerable एक में सब एक साथ डाल करने के लिए उपयोग कर सकते हैं इस तरह:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID) 
foreach(IEnumerable<smth> element in groups) 
{ 
//do something 
} 
+2

क्या यह सामान्य "ऑर्डरबी" जैसा नहीं है? सूची नई सूची = सूची .उडरबी (x => x.id) .सूची(); – MorgoZ

+0

@ मॉर्गोज़, सवाल 'समूह' लेने और एक फ्लैट सूची में वापस आने के बारे में है। –

+1

@MorgoZ, 'ऑर्डरबी (x => x.id)' उन्हें आईडी द्वारा आरोही क्रम में क्रमबद्ध करेगा। '.GroupBy (x => x.id) के साथ इसकी तुलना करें। चयन करें (समूह => समूह)', जो आईडी की पहली उपस्थिति के क्रम में उन्हें सॉर्ट करेगा। यदि मूल आईडी क्रम में हैं: [1,3,2,2,2,3,0], फिर उन्हें समूहित करना और फिर एक सूची में फ़्लैटन करना आईडी को नए क्रम में रखेगा: [1,3, 3,2,2,2,0]। –

24
foreach (var v in structure) 
{  
    var group = groups.Single(g => g.Key == v. ???); 
    v.ListOfSmth = group.ToList(); 
} 

सबसे पहले आप इच्छित समूह का चयन करने की जरूरत है। फिर आप समूह पर ToList विधि का उपयोग कर सकते हैं। IGrouping मूल्यों का IEnumerable है।

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable 

तुम सिर्फ तत्वों के माध्यम से पुनरावृति कर सकते हैं: IGrouping की परिभाषा से

List<smth> list = new List<smth>(); 
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id); 
IEnumerable<smth> smths = groups.SelectMany(group => group); 
List<smth> newList = smths.ToList(); 
7

:

+0

के उपयोग से नहीं किया जा सकता है, जो समूहों के माध्यम से समूह को – MikeT

+0

में आइटम नहीं करता है, फिर मेरी गलती, फिर: 'foreach (समूहों में smth p.electMany (sth => sth)) ' – user1275513

8

ऊपर जवाब में से अधिक स्पष्ट किया संस्करण:

IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA); 

foreach (var groupingByClassA in groups) 
{ 
    int propertyIntOfClassA = groupingByClassA.Key; 

    //iterating through values 
    foreach (var classA in groupingByClassA) 
    { 
     int key = classA.PropertyIntOfClassA; 
    } 
}