È possibile utilizzare MoreLINQ's Batch operator (disponibile da NuGet):
foreach(IEnumerable<User> batch in users.Batch(1000))
// use batch
Se l'utilizzo semplice della libreria non è un'opzione, è possibile riutilizzare implementazione:
public static IEnumerable<IEnumerable<T>> Batch<T>(
this IEnumerable<T> source, int size)
{
T[] bucket = null;
var count = 0;
foreach (var item in source)
{
if (bucket == null)
bucket = new T[size];
bucket[count++] = item;
if (count != size)
continue;
yield return bucket.Select(x => x);
bucket = null;
count = 0;
}
// Return the last bucket with all remaining elements
if (bucket != null && count > 0)
yield return bucket.Take(count);
}
BTW per prestazioni si può semplicemente restituire il secchio senza chiamare Select(x => x)
. Select è ottimizzato per gli array, ma il delegato del selettore verrà comunque richiamato su ciascun elemento. Quindi, nel tuo caso è meglio usare
yield return bucket;
fonte
2013-03-14 16:10:37
Eventuali duplicati di [creare batch in LINQ] (https://stackoverflow.com/ domande/13731796/create-batches-in-linq) –