कोड है कि आप को पेश केवल सूची में आइटम्स पुनरावृति हो जाने के बाद, के रूप में अन्य लोगों ने बताया है।
हालांकि, यह आपको केवल एक पृष्ठ के लिए आइटम देता है। यदि आप एकाधिक पृष्ठों को प्रबंधित कर रहे हैं, तो आपको प्रत्येक पृष्ठ के लिए एक बार कोड को कॉल करना होगा (क्योंकि कहीं आपको currentPage
बढ़ाना चाहिए, है ना?)।- प्रत्येक पृष्ठ के एक बार
for (int currentPage = 0; currentPage < numPages; ++currentPage)
{
foreach (var item in items.Skip(currentPage*itemsPerPage).Take(itemsPerPage))
{
//Do stuff
}
}
अब अगर आप कि करते हैं, तो आप अनुक्रम कई बार पुनरावृत्ति कर दिया जाएगा:
मैं क्या मतलब है कि आप कुछ इस तरह कर रही किया जाना चाहिए है। पहला पुनरावृत्ति केवल पहले पृष्ठ के अंत तक ही जाएगा, लेकिन अगला शुरुआत से दूसरे पृष्ठ के अंत तक (Skip()
और Take()
के माध्यम से) होगा - और अगला शुरुआत से ही फिर से शुरू होगा तीसरे पृष्ठ के अंत। और इसी तरह।
इससे बचने के लिए आप IEnumerable<T>
के लिए एक एक्सटेंशन विधि लिख सकते हैं जो बैच में डेटा को विभाजित करता है (जिसे आप "पृष्ठों" में डेटा को "पेजिंग" के रूप में भी वर्णित कर सकते हैं)।
सिर्फ IEnumerables की एक IEnumerable पेश करने के बजाय, यह एक कक्षा में प्रत्येक बैच रैप करने के लिए तो जैसे बैच में आइटम के साथ बैच सूचकांक आपूर्ति करने के लिए, और अधिक उपयोगी हो सकता है:
public sealed class Batch<T>
{
public readonly int Index;
public readonly IEnumerable<T> Items;
public Batch(int index, IEnumerable<T> items)
{
Index = index;
Items = items;
}
}
public static class EnumerableExt
{
// Note: Not threadsafe, so not suitable for use with Parallel.Foreach() or IEnumerable.AsParallel()
public static IEnumerable<Batch<T>> Partition<T>(this IEnumerable<T> input, int batchSize)
{
var enumerator = input.GetEnumerator();
int index = 0;
while (enumerator.MoveNext())
yield return new Batch<T>(index++, nextBatch(enumerator, batchSize));
}
private static IEnumerable<T> nextBatch<T>(IEnumerator<T> enumerator, int blockSize)
{
do { yield return enumerator.Current; }
while (--blockSize > 0 && enumerator.MoveNext());
}
}
इस विस्तार विधि डेटा को बफर नहीं करती है, और यह केवल एक बार इसके माध्यम से फिर से होती है।
इस विस्तार विधि को देखते हुए, यह आइटम को बैच करने के लिए और अधिक पठनीय हो जाता है। ध्यान दें कि यह उदाहरण के लिए, सभी पृष्ठों के लिए सभी वस्तुओं के माध्यम से विश्लेषण करता ओपी के उदाहरण जो केवल एक पृष्ठ के लिए आइटम के माध्यम से दोहराता के विपरीत:
var items = Enumerable.Range(10, 50); // Pretend we have 50 items.
int itemsPerPage = 20;
foreach (var page in items.Partition(itemsPerPage))
{
Console.Write("Page " + page.Index + " items: ");
foreach (var i in page.Items)
Console.Write(i + " ");
Console.WriteLine();
}
में एक को तोड़ने बिंदु रखो और देखते हैं। –
यह केवल एक विभाजन है। क्या आप इसे लूप से भी बुला रहे हैं? –