2012-03-15 15 views
33

Tengo el problema realmente molesto. He agrupado un conjunto de datos y no puedo acceder a los datos dentro del grupo. Puedo llegar al paletón no los datos ..¿Cómo iterar una interfaz IGrouping <T>?

tengo una carga de datos que se encuentra en forma

Data.Period = x 
Data.Adjustment = y 

realizo una GroupBy

var groupedData = Data.GroupBy(x => x.Period new {x.Period}); 

Esto trae de vuelta (de acuerdo a linq) mi información jerárquica que está empezando a verse como la quiero. Me gustaría repetir los contenidos pero no puedo ... ¿Cómo hago esto? y ¿cómo puedo ...

Trabaja cómo llegar al ajuste de datos sin usar una proyección. Y no quiero proyectar todavía porque tengo que realizar otra agrupación ... ¡ayuda! :-)

Respuesta

62

La interfaz IGrouping<TKey, TElement> hereda IEnumerable<TElement>:

foreach (var group in groupedData) 
{ 
    var groupKey = group.Key; 
    foreach (var groupedItem in group) 
     DoSomethingWith(groupKey, groupedItem); 
} 

observo que va a ser mejor usar esto para su consulta, sin embargo:

var groupedData = Data.GroupBy(x => x.Period); 

en lugar de esto:

var groupedData = Data.GroupBy(x => new {x.Period}); 

Si, por ejemplo, que quería para promediar los ajustes, usted puede hacer esto:

foreach (var group in groupedData) 
    Console.WriteLine("Period: {0}; average adjustment: {1}", group.Key, group.Average(i => i.Adjustment)); 
+0

Hola, ¿cómo hago una consulta sobre el grupo en la declaración final de foreach en tu código? ¿Cómo lo incluyo en un n Igroup? – Exitos

+0

@Exitos no necesita convertirlo en un 'IGroup'; ya * es * un 'IGrupo'. Vea la respuesta editada para un ejemplo. – phoog

+0

Entonces, ¿cómo puedo consultar al grupo después de su primera declaración foreach? gracias por cierto – Exitos

6

Sólo tiene que utilizar foreach:

foreach(var group in groupedData) 
{ 
    Console.WriteLine("Period: {0}", group.Key); 
    foreach(var item in group) 
     Console.WriteLine(" Adjustment: {0}", item.Adjustment); 
} 
+0

¡Gracias! :-) – Exitos

10

Cada elemento de una secuencia de IGrouping<TKey, TElement> es un IEnumerable<TElement> que se puede recorrer en iteración para obtener los datos que tiene un común TKey:

var groups = Data.GroupBy(x => x.Period); 
foreach(var group in groups) { 
    Console.WriteLine("Period: {0}", group.Key); 
    foreach(var item in group) { 
     Console.WriteLine("Adjustment: {0}", item.Adjustment); 
    } 
} 

Entonces, en lo anterior, groups es un IEnumerable<IGrouping<TPeriod, TAdjustment>> donde TPeriod es el tipo de Period (no nos lo comunicó) y TAdjustment es el tipo de Adjustment. Entonces, group es un objeto que implementa IEnumerable<TAdjustment> (pero también tiene una propiedad Key para que pueda obtener la clave. Por último, item es una TAdjustment, y para cada group, todo el item que provienen de la iteración en que group tienen el mismo . llave

+0

Hola, esto fue realmente útil gracias – Exitos

6

Aunque quizá obvio para los demás también se puede utilizar:

var groups = Data.GroupBy(x => x.Period); 

foreach(var group in groups) 
{ 
    List<Data> dataListByPeriod = group.ToList(); 
    //use this list 
} 
+0

Sí, pensé que tenía que hacer group (group.Key) .ToList() thx – masteroleary

Cuestiones relacionadas