Obter propriedade "Value" no IGrouping

141

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, IGroupingpois não consigo ver como acessar os registros de dados dentro do grupo!

fearofawhackplanet
fonte
1
A edição (Rev2) não foi muito construtiva, pois não corresponde a nenhuma das respostas.
Sunny Patel

Respostas:

170

O grupo implementa IEnumerable<T>- No caso geral , basta chamar foreacho group. No presente caso, já que você precisa de um List<T>:

list.Add(new DespatchGroup(group.Key, group.ToList());
Marc Gravell
fonte
Então, basicamente, se estamos a seguir a essência da questão valueé comparável a ToList()única que há mais de uma sobrecarga lá para convertê-lo em uma lista ao invés de apenas puxando para fora um valor
Coops
2
@ CodeBlend há mais custos indiretos porque eles querem uma lista. Se houvesse uma Valuespropriedade como eles imaginavam, eles teriam que fazer group.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 de DespachGroupnão da maneira como o IGrouping funciona.
Jon Hanna
35

Não há Valuespropriedade ou similar porque IGrouping<T>ela mesma é a IEnumerable<T>sequência de valores. Tudo o que você precisa fazer neste caso é converter essa sequência em uma lista:

list.Add(new DespatchGroup(group.Key, group.ToList());
LukeH
fonte
6
Também pode converter para um IEnumerable se quisermos: group.AsEnumerable().
Mateen Ulhaq
22

Para qualquer grupo selecionado, você pode ligar

var selectedGroupValues=selectedGroup.SelectMany(x=>x);
Bassl Kokash
fonte
2
Obrigado! Diferente de .Selectqual retornará um IGrouping <> novamente, .SelectManyretornará um IEnumerable do tipo de valores agrupados, que é o que eu procurava.
K0D4
Eu diria que só use isso quando houver (potencialmente) vários grupos selecionados. (aka IEnumerable<IGrouping<key,DespatchGroup>>). Caso contrário, use toList()ou simplesmente faça o lançamento IEnumerable<DespatchGroup>.
apple apple
21

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!

Rob H
fonte