J'ai une structure de données comme
public DespatchGroup(DateTime despatchDate, List<Products> products);
Et j'essaye de faire ...
var list = new List<DespatchGroup>();
foreach (var group in dc.GetDespatchedProducts().GroupBy(i => i.DespatchDate))
{
// group.Values is not correct... how do I write this?
list.Add(new DespatchGroup(group.Key, group.Values);
}
Je ne comprends évidemment pas IGrouping
car je ne vois pas comment accéder aux enregistrements de données au sein du groupe!
c#
linq
data-structures
igrouping
peur de la planète
la source
la source
Réponses:
Le groupe implémente
IEnumerable<T>
- Dans le cas général , il suffit d'appelerforeach
legroup
. Dans ce cas, puisque vous avez besoin d'unList<T>
:la source
value
c'est comparable àToList()
seulement il y a plus de frais généraux là-bas pour la convertir en une liste par opposition à simplement retirer une valeurValues
propriété comme ils l'ont imaginé, ils devraient le fairegroup.Values.ToList()
. Inversement, s'ils acceptaient n'importe quel énumérable au lieu d'une liste,new DespatchGroup(group.Key, group)
cela fonctionnerait. La surcharge provient de la définition deDespachGroup
non pas de la façon dont IGrouping fonctionne.Il n'y a pas de
Values
propriété ou similaire car leIGrouping<T>
lui - même est laIEnumerable<T>
séquence de valeurs. Tout ce que vous avez à faire dans ce cas est de convertir cette séquence en liste:la source
group.AsEnumerable()
.Pour tout groupe sélectionné, vous pouvez appeler
la source
.Select
qui retournera à nouveau un IGrouping <>,.SelectMany
retournera un IEnumerable du type des valeurs groupées, ce que je recherchais.IEnumerable<IGrouping<key,DespatchGroup>>
). Sinon, utiliseztoList()
-le ou lancez-le simplementIEnumerable<DespatchGroup>
.Juste un conseil connexe - puisque, comme l'ont dit les autres réponses, le regroupement est un IEnumerable, si vous avez besoin d'accéder à un index spécifique, vous pouvez utiliser
group.ElementAt(i)
.C'est probablement évident pour beaucoup de gens, mais j'espère que cela en aidera quelques-uns!
la source