2009-05-13 25 views
15

No puedo encontrar una manera de hacer que esto funcione y esperando que alguien tenga una idea. Un ejemplo simplificado sería tener una lista de decir enteros 1-100, quiero agrupar cada 3 filas para que el resultado sea 1,2,3 en el primer grupo, luego 4,5,6 en el siguiente grupo, etc. Sé cómo obtener cada n-ésimo registro, pero lo que necesito son todos los registros, así que puedo agregarlos, usando primero, último, suma, máximo, etc.Cómo usar Linq para agrupar cada N número de filas

¡Gracias!

+0

posible duplicado de la [Lista de Split en sublistas con LINQ] (http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal

Respuesta

22
var q = Enumerable.Range(0, 100).GroupBy(x => x/3); 

¿Falta algo?

+2

No, pero estoy por supuesto. Necesito dormir más. ¡¡¡Muchas gracias!!! – RBear

+0

Ser pedante - Enumerable.Range (1, 100) ya que quería comenzar en 1. –

+0

Si el primer número es 0, funciona bien. Pero si el primer número es 1, el primer grupo tiene un elemento menos. Por ejemplo, {0,1,2}, {3,4,5}, pero {1,2}, {3,4,5}. ¿Cómo arreglar esto? –

29

Este ejemplo debería funcionar para consultar colecciones no numéricas. Proyecta un índice en el objeto que se va a agrupar, y luego lo elimina de nuevo durante la agrupación.

var studentQuery2 = students 
    .Select((student, index) => new {student, index}) 
    .GroupBy(g => g.index/3, i => i.student); 
+0

Gracias también, pero ¿de dónde viene el índice? – RBear

+0

esperaba que el seleccionado proyectaría su índice en la consulta. Parece que no. Actualizaré el ejemplo en consecuencia, para que pueda usarlo con colecciones no basadas en int. –

+6

FYI, en la próxima versión del marco habrá un método de extensión "zip join". Si comprime un resultado de consulta con una secuencia infinita de enteros, obtendrá una secuencia indexada. Vea mi artículo reciente en el blog sobre este tema para más detalles. –

1

¿Qué tal un enfoque más simple:

var index = 0; 
var grpOf3s = students.GroupBy(x => index++/3); 

Actualización: Si está utilizando el valor Key del elemento de grupo, entonces necesitará para convertir el grupo numerable a una lista. De lo contrario, obtendrá un Key diferente cada vez que se acceda.

var index = 0; 
var grpOf3s = students.GroupBy(x => index++/3).ToList(); 
Cuestiones relacionadas