Eu tenho uma estrutura de dados como
public DespatchGroup(DateTime despatchDate, List<Products> products);
E eu estou tentando fazer ...
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, não estou entendendo, IGrouping
pois não consigo ver como acessar os registros de dados dentro do grupo!
c#
linq
data-structures
igrouping
fearofawhackplanet
fonte
fonte
Respostas:
O grupo implementa
IEnumerable<T>
- No caso geral , basta chamarforeach
ogroup
. No presente caso, já que você precisa de umList<T>
:fonte
value
é comparável aToList()
única que há mais de uma sobrecarga lá para convertê-lo em uma lista ao invés de apenas puxando para fora um valorValues
propriedade como eles imaginavam, eles teriam que fazergroup.Values.ToList()
. Por outro lado, se eles aceitassem qualquer enumerável em vez de uma lista,new DespatchGroup(group.Key, group)
funcionaria. A sobrecarga é da definição deDespachGroup
não da maneira como o IGrouping funciona.Não há
Values
propriedade ou similar porqueIGrouping<T>
ela mesma é aIEnumerable<T>
sequência de valores. Tudo o que você precisa fazer neste caso é converter essa sequência em uma lista:fonte
group.AsEnumerable()
.Para qualquer grupo selecionado, você pode ligar
fonte
.Select
qual retornará um IGrouping <> novamente,.SelectMany
retornará um IEnumerable do tipo de valores agrupados, que é o que eu procurava.IEnumerable<IGrouping<key,DespatchGroup>>
). Caso contrário, usetoList()
ou simplesmente faça o lançamentoIEnumerable<DespatchGroup>
.Apenas uma dica relacionada - já que, como as outras respostas disseram, o agrupamento é um IEnumerable, se você precisar acessar um índice específico, poderá usar
group.ElementAt(i)
.Isso provavelmente é óbvio para muitas pessoas, mas espero que ajude algumas!
fonte