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, IGrouping
ya 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 llameforeach
algroup
. En este caso, ya que necesita unList<T>
:fuente
value
es comparable a queToList()
solo hay más gastos generales para convertirla en una lista en lugar de simplemente extraer un valorValues
propiedad 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 deDespachGroup
no de la forma en que funciona IGrouping.No hay ninguna
Values
propiedad 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
.Select
lo que devolverá un IGrouping <> nuevamente,.SelectMany
devolverá 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