Dies ist das Gleiche wie die akzeptierte Antwort, jedoch eine viel einfachere Darstellung:
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> items,
int numOfParts)
{
int i = 0;
return items.GroupBy(x => i++ % numOfParts);
}
Das obige Verfahren teilt eine IEnumerable<T>
in N Anzahl von Blöcken gleicher Größe oder nahezu gleicher Größe auf.
public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> items,
int partitionSize)
{
int i = 0;
return items.GroupBy(x => i++ / partitionSize).ToArray();
}
Bei der obigen Methode wird ein IEnumerable<T>
in Blöcke mit der gewünschten festen Größe aufgeteilt, wobei die Gesamtzahl der Blöcke unwichtig ist - worum es bei der Frage nicht geht.
Das Problem bei der Split
Methode ist, dass sie nicht nur langsamer ist, sondern auch die Ausgabe in dem Sinne verschlüsselt, dass die Gruppierung auf der Grundlage des i-ten Vielfachen von N für jede Position erfolgt, oder mit anderen Worten, Sie erhalten die Chunks nicht in der ursprünglichen Reihenfolge.
Fast jede Antwort hier bewahrt entweder nicht die Ordnung oder handelt von Partitionierung und nicht von Aufteilung oder ist eindeutig falsch. Versuchen Sie dies, was schneller ist, die Ordnung bewahrt, aber ein bisschen ausführlicher ist:
public static IEnumerable<IEnumerable<T>> Split<T>(this ICollection<T> items,
int numberOfChunks)
{
if (numberOfChunks <= 0 || numberOfChunks > items.Count)
throw new ArgumentOutOfRangeException("numberOfChunks");
int sizePerPacket = items.Count / numberOfChunks;
int extra = items.Count % numberOfChunks;
for (int i = 0; i < numberOfChunks - extra; i++)
yield return items.Skip(i * sizePerPacket).Take(sizePerPacket);
int alreadyReturnedCount = (numberOfChunks - extra) * sizePerPacket;
int toReturnCount = extra == 0 ? 0 : (items.Count - numberOfChunks) / extra + 1;
for (int i = 0; i < extra; i++)
yield return items.Skip(alreadyReturnedCount + i * toReturnCount).Take(toReturnCount);
}
Die äquivalente Methode für eine Partition
Operation hier