अधिकांश उत्तर में एक ही दोष हो सकता है। एक खाली पाठ को देखते हुए वे कुछ भी नहीं कमाएंगे। हम (i) कम से कम उस रिक्त स्ट्रिंग को वापस पाने की उम्मीद करते हैं (स्ट्रिंग में नहीं होने वाले चार पर एक विभाजन के समान व्यवहार, जो एक आइटम वापस देगा:
इसलिए हमें कम से कम एक बार लूप करना चाहिए हर समय (जॉन की कोड के आधार पर):
IEnumerable<string> SplitIntoChunks (string text, int chunkSize)
{
int offset = 0;
do
{
int size = Math.Min (chunkSize, text.Length - offset);
yield return text.Substring (offset, size);
offset += size;
} while (offset < text.Length);
}
या के लिए एक का उपयोग कर (संपादित: एक छोटे से इस के साथ और अधिक कर रही के बाद, मैं मामले chunkSize पाठ से अधिक को संभालने के लिए एक बेहतर रास्ता मिल गया):
IEnumerable<string> SplitIntoChunks (string text, int chunkSize)
{
if (text.Length <= chunkSize)
yield return text;
else
{
var chunkCount = text.Length/chunkSize;
var remainingSize = text.Length % chunkSize;
for (var offset = 0; offset < chunkCount; ++offset)
yield return text.Substring (offset * chunkSize, chunkSize);
// yield remaining text if any
if (remainingSize != 0)
yield return text.Substring (chunkCount * chunkSize, remainingSize);
}
}
भी/करते हैं के साथ इस्तेमाल किया जा सकता है कि, जबकि पाश;)
क्या आप वाकई 512 ** चार ** मात्रा की जरूरत है? क्योंकि यह 512 ** बाइट्स से अलग है ** जो एक अधिक आम बाधा है। –
@ हेंक: दूसरी तरफ, * बाइट्स * के आधार पर विभाजित * पाठ * भाग में अजीब होगा - परिणाम एन्कोडिंग पर निर्भर होंगे। –
जॉन, हां, पाठ को फिर से इकट्ठा करते समय एक आम समस्या है। लेकिन कुछ I/O चैनल 512 बाइट ब्लॉक में काम करते हैं। –