2010-07-19 22 views
6

He estado usando 101 LINQ Samples para mojarme los pies usando LINQ. Ha sido un buen primer recurso, pero no puedo ver un ejemplo de lo que actualmente necesito.Número de grupo en un grupo LINQ por consulta

Solo necesito asociar un número de grupo secuencial con cada grupo. Tengo una solución de trabajo:

var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details }; 


int groupNumber = 0; 
foreach (var group in groups) 
{ 
    // 
    // process each group and it's records ... 
    // 

    groupNumber++; 
} 

Pero, estoy seguro de que es posible utilizar LINQ para generar también groupNumber. ¿Cómo?

Respuesta

9

Esto depende de sus necesidades exactas, pero se puede utilizar:

var groupArray = groups.ToArray(); 

Del mismo modo, puede utilizar ToList. Estas estructuras de datos son secuenciales, y cada grupo tiene un índice.


Si necesita el índice en el objeto de crear, otra opción es utilizar Select:

list.GroupBy(c => c.Name) 
    .Select((details, ind) => 
    new 
    { 
     Name = details.Key, 
     DetailRecords = details, 
     Index = ind 
    }); 
+0

heh, inteligente. Me gusta. –

+0

+1 ... inteligente =) – Luiscencio

+0

Aquí hay dos respuestas. Me gusta la solución ToList, pero la selección de dos parámetros fue exactamente lo que estaba buscando. Muchas gracias. –

6

esto debe hacer el truco:

int groupNumber = 0; 
var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details, grpNum = groupNumber++}; 
+0

+1 para asociar el Número de grupo con el resultado LINQ. –

1

si es sólo un número de grupo secuencial, sólo tiene que utilizar el método Count() en su IEnumerable.

var groups = 
    from c in list 
    group c by c.Name into details 
    select new {Name = details.Key, DetailRecords = details}; 

for(int i = 0; i < groups.Count(); i++) 
{ 
    //Process Records 
} 

Entonces, si usted necesita el número de grupo específico, puede simplemente tomar i.

+0

Me gusta mi solución original, pero más limpia porque el incremento no se perderá en el código de procesamiento. –