więc chcesz skutecznie wywołać Dump()
na każde 5 pozycji w q
.
Rozwiązanie, które teraz posiadasz, ponownie przetworzy IEnumerable<T>
za każdym razem poprzez pętlę for
. To może być bardziej efektywne, aby zrobić coś takiego: (Nie wiem co Twój typ jest więc używam 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();
}
ta korzysta tylko z jednego iterator. Biorąc pod uwagę zmienną o nazwie q
, zakładam, że jest to skrót od "query", co oznacza, że jest to sprzeczne z bazą danych. Zatem użycie tylko jednego iteratora może być bardzo korzystne.
Mogę zachować ten kod i zawinąć go w metodę rozszerzenia. Co powiesz na "kępę"?
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);
}
Nazywając to w kontekście kodzie:
foreach (var clump in q.Clump(5)) {
clump.Dump();
}
Wow. Przykro mi, ale z wyglądu reszty kodu, naprawdę nie mogę uwierzyć, że musiałaś zadać to pytanie. –
umm .. myślałem, że ktoś może wiedzieć, jak uzyskać iterator, aby wznowić od miejsca, w którym zostało przerwane, lub coś takiego, żebym mógł powiedzieć coś w stylu while (items.HasMore) Take (5) .... również mógłbym kodować zbyt długo ... :) –
Chyba brakowało mi tego, co dokładnie próbowaliście osiągnąć. Moje przeprosiny - zobacz moją odpowiedź poniżej. –