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!

Miedo de planetas
fuente
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());
Marc Gravell
fuente
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());
LukeH
fuente
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);
Bassl Kokash
fuente
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!

Rob H
fuente