Comment obtenir des valeurs de IGrouping

J'ai une question sur IGrouping et Select() méthode.

Disons que j'ai IEnumerable<IGrouping<int, smth>> de cette façon:

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

Où la liste est un List<smth>.

Et maintenant je dois passer les valeurs de chaque IGrouping à une autre liste d'une manière ou d'une autre.:

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

Quelqu'un peut-il suggérer comment obtenir des valeurs (List<smth>) à partir de IGrouping<int, smth> dans un tel contexte?

145
demandé sur Kirill Kobelev 2011-12-15 17:43:10

4 réponses

Depuis IGrouping<TKey, TElement> implémente IEnumerable<TElement>, vous pouvez utiliser SelectMany pour mettre toutes les IEnumerables en un seul retour IEnumerable, tous ensemble:

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();
209
répondu Matt Smith 2014-04-28 21:21:09
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

Vous devez d'Abord sélectionner le groupe souhaité. Ensuite, vous pouvez utiliser la méthode ToList de sur le groupe. Le IGrouping est un IEnumerable des valeurs.

26
répondu Tim Cools 2014-04-28 21:21:42

De la définition de IGrouping:

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

Vous pouvez simplement parcourir des éléments comme ceci:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID)
foreach(IEnumerable<smth> element in groups)
{
//do something
}
9
répondu user1275513 2013-08-21 14:09:46

Version plus clarifiée des réponses ci-dessus:

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;
    }
}
8
répondu Bronek 2015-05-24 21:16:35