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!


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());

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());

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);

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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.