यह स्वीकृत उत्तर के समान है, लेकिन बहुत सरल प्रतिनिधित्व है:
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> items,
int numOfParts)
{
int i = 0;
return items.GroupBy(x => i++ % numOfParts);
}
उपरोक्त विधि IEnumerable<T>
समान आकारों के एन संख्या में या समान आकार के करीब विभाजित होती है।
public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> items,
int partitionSize)
{
int i = 0;
return items.GroupBy(x => i++ / partitionSize).ToArray();
}
उपरोक्त विधि एक विभाजन करती है IEnumerable<T>
वांछित निश्चित आकार के टुकड़ों में जिसमें कुल संख्या महत्वहीन होती है - जो कि प्रश्न के बारे में नहीं है।
के साथ समस्या है Split
विधि के , धीमी होने के अलावा, यह है कि यह इस अर्थ में आउटपुट को स्क्रैम्बल करता है कि ग्रुपिंग प्रत्येक स्थिति के लिए i'th मल्टीपल एन के आधार पर की जाएगी, या दूसरे शब्दों में आपको चांस नहीं मिलेगा। मूल क्रम में।
यहां लगभग हर उत्तर या तो आदेश को संरक्षित नहीं करता है, या विभाजन के बारे में है और विभाजन नहीं है, या स्पष्ट रूप से गलत है। यह प्रयास करें जो तेज़ है, आदेश को संरक्षित करता है लेकिन एक lil 'अधिक क्रिया:
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);
}
यहाँ एक Partition
ऑपरेशन के लिए समकक्ष विधि