web-dev-qa-db-fra.com

Comment obtenir des valeurs d'IGrouping

J'ai une question à propos de la méthode IGrouping et Select ().

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

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

où 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>) de IGrouping<int, smth> dans un tel contexte?

172
Illia Ratkevych

Puisque IGrouping<TKey, TElement> implémente IEnumerable<TElement>, vous pouvez utiliser SelectMany pour mettre tous les IEnumerables dans un 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();
247
Matt Smith
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 du groupe. La IGrouping est une IEnumerable des valeurs.

29
Tim Cools

De la définition de l'IGrouping:

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

vous pouvez simplement parcourir des éléments comme celui-ci:

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

Version plus précise 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;
    }
}
11
Bronek