Cómo obtener valores de IGrouping

Resuelto Illia Ratkevych asked hace 12 años • 8 respuestas

Tengo una pregunta sobre IGroupingel Select()método.

Digamos que tengo un IEnumerable<IGrouping<int, smth>>de esta manera:

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

Dónde listestá un List<smth>.

Y ahora necesito pasar los valores de cada uno IGroupinga otra lista de alguna manera:

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

¿Alguien puede sugerir cómo obtener los valores ( List<smth>) de an IGrouping<int, smth>en tal contexto?

Illia Ratkevych avatar Dec 15 '11 20:12 Illia Ratkevych
Aceptado

Desde IGrouping<TKey, TElement>implements IEnumerable<TElement>, puedes usar SelectManypara poner todo IEnumerablesen uno, IEnumerabletodos 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();

Aquí hay un ejemplo que compila/ejecuta: https://dotnetfiddle.net/DyuaaP

Video comentario de esta solución: https://youtu.be/6BsU1n1KTdo

Matt Smith avatar Dec 15 '2011 13:12 Matt Smith
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

Primero debe seleccionar el grupo deseado. Entonces puedes usar el ToListmétodo de en el grupo. El IGroupinges uno IEnumerablede los valores.

Tim Cools avatar Dec 15 '2011 13:12 Tim Cools

Versión más aclarada de las respuestas anteriores:

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;
    }
}
Bronek avatar May 24 '2015 21:05 Bronek