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!


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());

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());

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);

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!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.