2011-01-26 3 views
88

J'ai une structure de données commeGet "Value" propriété IGrouping

public DespatchGroup(DateTime despatchDate, List<Products> products); 

Et je suis en train 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 suis évidemment pas comprendre IGrouping que je peux » t voir comment accéder aux enregistrements de données dans le groupe!

+1

La modification [(Rev2)] (http://stackoverflow.com/revisions/4804477/2) n'a pas été très constructive car il n'a pas correspondre à l'une des réponses. –

Répondre

112

Le groupe met en œuvre IEnumerable<T> - Dans le général cas, il suffit d'appeler foreach sur la group. Dans ce cas, puisque vous avez besoin d'une List<T>:

list.Add(new DespatchGroup(group.Key, group.ToList()); 
+0

Donc, fondamentalement, si nous suivons l'essence de la question 'value' est comparable à' ToList() 'seulement il y a plus d'overhead là pour le convertir en une liste par opposition à simplement sortir une valeur – Coops

+1

@CodeBlend il y a plus frais généraux parce qu'ils veulent une liste. S'il y avait une propriété 'Values' comme ils l'imaginaient alors ils devraient faire' group.Values.ToList() '. Inversement, s'ils acceptaient n'importe quel énumérable au lieu d'une liste, alors 'new DespatchGroup (group.Key, group)' fonctionnerait. Le surcoût provient de la définition de 'DespachGroup' et non de la façon dont IGrouping fonctionne. –

24

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

list.Add(new DespatchGroup(group.Key, group.ToList()); 
+2

Nous pouvons également convertir en IEnumerable si nous le souhaitons: 'group.AsEnumerable()'. –

12

Juste un conseil connexe - puisque, comme les autres réponses ont dit, le regroupement est un IEnumerable, si vous avez besoin d'accéder à un particulier index, vous pouvez utiliser group.ElementAt(i).

Ceci est probablement évident pour beaucoup de gens mais j'espère que ça va en aider quelques-uns!

1

Pour tout groupe sélectionné, vous pouvez appeler

var selectedGroupValues=selectedGroup.SelectMany(x=>x);