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!
c#
linq
data-structures
igrouping
Miedo de planetas
fuente
fuente

Respuestas:
El grupo implementa
IEnumerable<T>: en el caso general , simplemente llameforeachalgroup. En este caso, ya que necesita unList<T>:fuente
valuees comparable a queToList()solo hay más gastos generales para convertirla en una lista en lugar de simplemente extraer un valorValuespropiedad como la habían imaginado, tendrían que hacerlagroup.Values.ToList(). Por el contrario, si aceptaran cualquier enumerable en lugar de una lista, entoncesnew DespatchGroup(group.Key, group)funcionaría. La sobrecarga proviene de la definición deDespachGroupno de la forma en que funciona IGrouping.No hay ninguna
Valuespropiedad o similares, ya que laIGrouping<T>misma es laIEnumerable<T>secuencia de valores. Todo lo que necesita hacer en este caso es convertir esa secuencia en una lista:fuente
group.AsEnumerable().Para cualquier grupo seleccionado, puede llamar
fuente
.Selectlo que devolverá un IGrouping <> nuevamente,.SelectManydevolverá un IEnumerable del tipo de valores agrupados, que es lo que estaba buscando.IEnumerable<IGrouping<key,DespatchGroup>>) De lo contrario, úselotoList()o simplemente envíeloIEnumerable<DespatchGroup>.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!
fuente