Obtenir la propriété «Value» dans IGrouping

141

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 IGroupingcar je ne vois pas comment accéder aux enregistrements de données au sein du groupe!

peur de la planète
la source
1
La modification (Rev2) n'était pas très constructive car elle ne correspond à aucune des réponses.
Sunny Patel

Réponses:

170

Le groupe implémente IEnumerable<T>- Dans le cas général , il suffit d'appeler foreachle group. Dans ce cas, puisque vous avez besoin d'un List<T>:

list.Add(new DespatchGroup(group.Key, group.ToList());
Marc Gravell
la source
Donc, fondamentalement, si nous suivons l'essence de la question, valuec'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 valeur
Coops
2
@CodeBlend il y a plus de frais généraux parce qu'ils veulent une liste. S'il y avait une Valuespropriété comme ils l'ont imaginé, ils devraient le faire group.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 de DespachGroupnon pas de la façon dont IGrouping fonctionne.
Jon Hanna
35

Il n'y a pas de Valuespropriété ou similaire car le IGrouping<T>lui - même est la IEnumerable<T>séquence de valeurs. Tout ce que vous avez à faire dans ce cas est de convertir cette séquence en liste:

list.Add(new DespatchGroup(group.Key, group.ToList());
LukeH
la source
6
Nous pouvons également convertir en un IEnumerable si l' on veut: group.AsEnumerable().
Mateen Ulhaq
22

Pour tout groupe sélectionné, vous pouvez appeler

var selectedGroupValues=selectedGroup.SelectMany(x=>x);
Bassl Kokash
la source
2
Merci! Contrairement à .Selectqui retournera à nouveau un IGrouping <>, .SelectManyretournera un IEnumerable du type des valeurs groupées, ce que je recherchais.
K0D4
Je dirais que n'utilisez ceci que lorsqu'il y a (potentiellement) plusieurs groupes sélectionnés. (aka IEnumerable<IGrouping<key,DespatchGroup>>). Sinon, utilisez toList()-le ou lancez-le simplement IEnumerable<DespatchGroup>.
pomme pomme le
21

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!

Rob H
la source