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?
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();
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.
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
}
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;
}
}