यह while
नहीं है बनाम foreach
जिससे फर्क पड़ता है। यह कॉल है .Cast<T>()
।
पहले नमूने में, आप उसी . पर उपज कर रहे हैं जबकि लूप के प्रत्येक पुनरावृत्ति में वस्तु। यदि आप सावधान नहीं हैं, तो आप वास्तव में डेटा का उपयोग करने से पहले उपज इटरेटर को पूरा कर चुके हैं, और डेटा रीडर पहले ही निपटाया जाएगा। यह तब हो सकता है जब आप कहें, .ToList()
इस विधि को कॉल करने के बाद। सूची में प्रत्येक रिकॉर्ड के लिए एक ही मूल्य के लिए आप सबसे अच्छी उम्मीद कर सकते हैं।
(प्रो टिप:अधिकांश समय आप .ToList()
जब तक आपको बिल्कुल नहीं करना है। केवल IEnumerable रिकॉर्ड के साथ काम करना बेहतर है)। उप>
दूसरे नमूने में, जब आप .Cast<T>()
. को कॉल करते हैं डेटारेडर पर, आप प्रभावी रूप से डेटा की एक प्रति बना रहे हैं क्योंकि यह प्रत्येक रिकॉर्ड के माध्यम से पुनरावृत्त होता है। अब आप वही वस्तु नहीं दे रहे हैं।