2011-01-26 20 views
88

Tengo una estructura de datos comoobtener la propiedad "Valor" en IGrouping

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

Y yo estoy tratando de hacer ...

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

Estoy obviamente no entender IGrouping como pueda' ¡Ver cómo llegar realmente a los registros de datos dentro del grupo!

+1

La edición [(Rev2)] (http://stackoverflow.com/revisions/4804477/2) no fue muy constructivo, ya que no hace coincide con cualquiera de las respuestas. –

Respuesta

112

El Grupo realiza una IEnumerable<T> - En el caso general, sólo llame foreach sobre el group. En este caso, ya que se necesita una List<T>:

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

Así que, básicamente, si seguimos la esencia de la pregunta 'valor' es comparable a' ToList() 'solo hay más de una sobrecarga allí para convertirla en una lista en lugar de simplemente extraer un valor – Coops

+1

@CodeBlend hay más sobrecarga porque quieren una lista. Si hubiera una propiedad 'Values' como ellos imaginaban, entonces tendrían que hacer' group.Values.ToList() '. Por el contrario, si aceptaran cualquier enumerable en lugar de una lista, entonces 'nuevo DespatchGroup (group.Key, group)' funcionaría. La sobrecarga proviene de la definición de 'DespachGroup' no de la forma en que funciona IGrouping. –

24

No hay Values propiedad o similares, ya que el propio IGrouping<T> es la secuencia IEnumerable<T> de valores. Todo lo que debe hacer en este caso es convertir esa secuencia a una lista:

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

También podemos convertir a un IEnumerable si deseamos: 'group.AsEnumerable()'. –

12

Sólo un consejo relacionado - ya que, como las otras respuestas han dicho, la agrupación es un IEnumerable, si necesita acceder a una específica índice puede usar group.ElementAt(i).

Esto es probablemente obvio para muchas personas, pero espero que ayude a algunos.

1

Para cualquier grupo seleccionado, se puede llamar

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