it-swarm-pt.tech

Como obter valores do IGrouping

Eu tenho uma pergunta sobre o método IGrouping e Select ().

Vamos dizer que eu tenho IEnumerable<IGrouping<int, smth>> desta maneira:

var groups = list.GroupBy(x => x.ID);

onde list é um List<smth>.

E agora preciso passar valores de cada IGrouping para outra lista de alguma forma:

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}

Alguém pode sugerir como obter valores (List<smth>) de IGrouping<int, smth> em tal contexto?

166
Illia Ratkevych

Como IGrouping<TKey, TElement> implementa IEnumerable<TElement>, você pode usar SelectMany para colocar todos os IEnumerables de volta em um IEnumerable todos juntos:

List<smth> list = new List<smth>();
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id);
IEnumerable<smth> smths = groups.SelectMany(group => group);
List<smth> newList = smths.ToList();
243
Matt Smith
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

Primeiro você precisa selecionar o grupo desejado. Então você pode usar o método ToList no grupo. O IGrouping é um IEnumerable dos valores.

29
Tim Cools

Da definição de IGrouping:

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable

você pode apenas percorrer elementos como este:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID)
foreach(IEnumerable<smth> element in groups)
{
//do something
}
14
user1275513

Versão mais esclarecida das respostas acima:

IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA);

foreach (var groupingByClassA in groups)
{
    int propertyIntOfClassA = groupingByClassA.Key;

    //iterating through values
    foreach (var classA in groupingByClassA)
    {
        int key = classA.PropertyIntOfClassA;
    }
}
10
Bronek