IGrouping से मान कैसे प्राप्त करें


211

मेरा एक सवाल IGroupingऔर Select()तरीका है।

मान लीजिए कि मुझे IEnumerable<IGrouping<int, smth>>इस तरह से मिल गया है :

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

जहां listएक है List<smth>

और अब मुझे प्रत्येक IGroupingसूची के मानों को किसी अन्य सूची में पारित करने की आवश्यकता है :

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

क्या कोई सुझाव दे सकता है कि ऐसे संदर्भ में मूल्यों ( List<smth>) को कैसे प्राप्त किया जाए IGrouping<int, smth>?


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

जवाबों:


277

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

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();

3
क्या यह सामान्य "आदेश" के समान नहीं है? सूची <smth> newList = सूची .OrderBy (x => x.id) .TLList ();
MorgoZ

@MorgoZ, सवाल groupsफ्लैट ले जाने और वापस पाने के बारे में है ।
मैट स्मिथ

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

2
यह मेरे लिए काम नहीं करता है .. यह कहता है कि उपयोग के द्वारा प्रकार का अनुमान नहीं लगाया जा सकता है
स्पष्ट

3
प्रकार का उपयोग नहीं किया जा सकता है
लियो गुरदियन

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

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


17

उपरोक्त उत्तरों का अधिक स्पष्ट संस्करण:

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;
    }
}

मुझे ऐसा नहीं लगता, कम से कम अभी के लिए।
एसएनआर

15

IGrouping की परिभाषा से:

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

आप इस तरह तत्वों के माध्यम से बस पुनरावृत्ति कर सकते हैं:

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

1
वह समूह में आइटम नहीं समूह के माध्यम से पुनरावृति करता है
माइक

1
ओह मेरी गलती है, तो: 'foreach (समूहों में smth p। SlectMany (sth => sth))'
user1275513
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.