Así que desea llamar de manera eficiente Dump()
de cada 5 artículos en q
.
La solución que tiene ahora volverá a iterar el IEnumerable<T>
cada vez a través del bucle for
. Puede ser más eficiente para hacer algo como esto: (No sé lo que su tipo es por lo que estoy usando T
)
const int N = 5;
T[] ar = new T[N]; // Temporary array of N items.
int i=0;
foreach(var item in q) { // Just one iterator.
ar[i++] = item; // Store a reference to this item.
if (i == N) { // When we have N items,
ar.Dump(); // dump them,
i = 0; // and reset the array index.
}
}
// Dump the remaining items
if (i > 0) {
ar.Take(i).Dump();
}
Esto sólo usa un iterador. Teniendo en cuenta que su variable se llama q
, asumo que es la abreviatura de "consulta", lo que implica que esto va en contra de una base de datos. Entonces, usar solo un iterador puede ser muy beneficioso.
Es posible que conserve este código y lo termine en un método de extensión. ¿Qué tal "agrupar"?
public static IEnumerable<IEnumerable<T>> Clump<T>(this IEnumerable<T> items, int clumpSize) {
T[] ar = new T[clumpSize];
int i=0;
foreach(var item in items) {
ar[i++] = item;
if (i == clumpSize) {
yield return ar;
i = 0;
}
}
if (i > 0)
yield return ar.Take(i);
}
Llamándola en el contexto de su código:
foreach (var clump in q.Clump(5)) {
clump.Dump();
}
Wow. Lo siento, pero a juzgar por el resto del código, ** realmente ** no puedo creer que tengas que hacer esta pregunta. –
umm ... estaba pensando que alguien podría saber cómo obtener un iterador para reanudarlo desde donde lo dejó o algo así para poder decir algo así como while (items.HasMore) Take (5) .... también podría estar codificando también mucho ... :) –
Creo que me perdí lo que exactamente estabas tratando de lograr. Mis disculpas: mira mi respuesta a continuación. –