Obtenga la propiedad "Value" en IGrouping


141

Tengo una estructura de datos como

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

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

¡Obviamente no entiendo, IGroupingya que no puedo ver cómo llegar realmente a los registros de datos dentro del grupo!


1
La edición (Rev2) no fue muy constructiva ya que no coincide con ninguna de las respuestas.
Sunny Patel

Respuestas:


170

El grupo implementa IEnumerable<T>: en el caso general , simplemente llame foreachal group. En este caso, ya que necesita un List<T>:

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

Básicamente, si estamos siguiendo la esencia de la pregunta, valuees comparable a que ToList()solo hay más gastos generales para convertirla en una lista en lugar de simplemente extraer un valor
Coops

2
@CodeBlend hay más gastos generales porque quieren una lista. Si hubiera una Valuespropiedad como la habían imaginado, tendrían que hacerla group.Values.ToList(). Por el contrario, si aceptaran cualquier enumerable en lugar de una lista, entonces new DespatchGroup(group.Key, group)funcionaría. La sobrecarga proviene de la definición de DespachGroupno de la forma en que funciona IGrouping.
Jon Hanna

35

No hay ninguna Valuespropiedad o similares, ya que la IGrouping<T>misma es la IEnumerable<T>secuencia de valores. Todo lo que necesita hacer en este caso es convertir esa secuencia en una lista:

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

66
También podemos convertir a un IEnumerable si deseamos: group.AsEnumerable().
Mateen Ulhaq

22

Para cualquier grupo seleccionado, puede llamar

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

2
¡Gracias! A diferencia de .Selectlo que devolverá un IGrouping <> nuevamente, .SelectManydevolverá un IEnumerable del tipo de valores agrupados, que es lo que estaba buscando.
K0D4

Yo diría que solo use esto cuando haya (potencialmente) múltiples grupos seleccionados. (aka IEnumerable<IGrouping<key,DespatchGroup>>) De lo contrario, úselo toList()o simplemente envíelo IEnumerable<DespatchGroup>.
manzana manzana

21

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

Probablemente esto sea obvio para mucha gente, ¡pero con suerte ayudará a algunos!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.