मान लीजिए मैं एक IEnumerable<T>
है, और मुझे पहला तत्व लेने के लिए और कुछ अन्य कोड के लिए शेष तत्व पास करना चाहते हैं। मैं Take(n)
का उपयोग कर पहली n तत्वों प्राप्त कर सकते हैं, लेकिन कैसे मैं तो गणना फिर से शुरू करने के लिए पैदा करने के बिना शेष तत्वों का उपयोग कर सकते हैं?क्या मैं पहले एन तत्वों को एक गणना से ले सकता हूं, और फिर भी शेष गणना का उपयोग कर सकता हूं?
उदाहरण के लिए, मान लीजिए कि मेरे पास एक विधि ReadRecords
है जो CSV फ़ाइल में रिकॉर्ड को IEnumerable<string>
के रूप में स्वीकार करता है। अब मान लीजिए कि उस विधि के भीतर, मैं पहला रिकॉर्ड (हेडर) पढ़ना चाहता हूं, और उसके बाद शेष रिकॉर्ड ReadDataRecords
विधि को पास करता हूं जो IEnumerable<string>
भी लेता है। इस तरह:
void ReadCsv(IEnumerable<string> records)
{
var headerRecord = records.Take(1);
var dataRecords = ???
ReadDataRecords(dataRecords);
}
void ReadDataRecords(IEnumerable<string> records)
{
// ...
}
अगर मैं गणन फिर से शुरू करने के लिए तैयार थे, तो मैं dataRecords = records.Skip(1)
इस्तेमाल कर सकते हैं। हालांकि, मैं इसे फिर से शुरू नहीं करना चाहता - वास्तव में, यह फिर से शुरू नहीं हो सकता है।
तो, वहाँ किसी भी तरह से पहले रिकॉर्ड लेने के लिए शेष रिकॉर्ड (एक नया संग्रह और उन्हें फिर से गणना में सभी मूल्यों को पढ़ने के अतिरिक्त) है, और फिर?
यदि आपको केवल एक को छोड़ने की आवश्यकता है तो बड़ा सौदा क्या है? बस फिर से गिनती और एक छोड़ दो? – Paparazzi
वहाँ MoreLinq में अच्छा समाधान है कि आप कुछ [बैचिंग समर्थन] की जरूरत है (http://stackoverflow.com/questions/13731796/create-batches-in-linq)। विशेष आवरण पहले/अंतिम तत्व के बारे में भी कई प्रश्न हैं। –
@ बलाम: यदि गणना सूची में वस्तुओं पर गणना करने जैसे कुछ स्मृति में गणना करके बनाई गई थी, तो हाँ। लेकिन क्या होगा यदि गणना फिर से शुरू नहीं की जा सकती है, या निष्पादित करने के लिए बहुत महंगा है? मैं नहीं देखता कि दो अंक होने के लिए क्यों जरूरी होना चाहिए जब मैं केवल एक ही आइटम को एक बार लाने के लिए चाहता हूं। –