c# - IENumerable बनाम सूची-क्या उपयोग करें? वो कैसे काम करते है?




linq list (6)

IENumerable का लाभ स्थगित निष्पादन (आमतौर पर डेटाबेस के साथ) है। जब तक आप डेटा के माध्यम से वास्तव में लूप नहीं करते हैं तब तक क्वेरी निष्पादित नहीं की जाएगी। यह एक प्रश्न है जब तक इसकी आवश्यकता नहीं है (उर्फ आलसी लोडिंग)।

यदि आप ToList को कॉल करते हैं, तो क्वेरी निष्पादित की जाएगी, या "भौतिक" जैसा कि मैं कहना चाहूंगा।

दोनों के लिए पेशेवर और विपक्ष हैं। यदि आप ToList को कॉल करते हैं, तो आप कुछ रहस्य हटा सकते हैं जब क्वेरी निष्पादित होती है। यदि आप IENumerable से चिपके रहते हैं, तो आपको लाभ मिलता है कि प्रोग्राम वास्तव में आवश्यक होने तक कोई काम नहीं करता है।

मुझे कुछ संदेह हैं कि एन्युमरेटर्स कैसे काम करते हैं, और LINQ। इन दो साधारण चयनों पर विचार करें:

List<Animal> sel = (from animal in Animals 
                    join race in Species
                    on animal.SpeciesKey equals race.SpeciesKey
                    select animal).Distinct().ToList();

या

IEnumerable<Animal> sel = (from animal in Animals 
                           join race in Species
                           on animal.SpeciesKey equals race.SpeciesKey
                           select animal).Distinct();

मैंने अपनी मूल वस्तुओं के नाम बदल दिए ताकि यह एक अधिक सामान्य उदाहरण जैसा दिखता हो। क्वेरी स्वयं महत्वपूर्ण नहीं है। मैं क्या पूछना चाहता हूं यह है:

foreach (Animal animal in sel) { /*do stuff*/ }
  1. मैंने देखा कि यदि मैं IEnumerable उपयोग करता हूं, जब मैं "सेल" का डीबग और निरीक्षण करता हूं, जो उस मामले में आईनेमरेबल है, इसमें कुछ दिलचस्प सदस्य हैं: "आंतरिक", "बाहरी", "आंतरिककी चयनकर्ता" और "बाहरी के चयनकर्ता", ये अंतिम 2 प्रतिनिधियों के रूप में दिखाई देते हैं। "आंतरिक" सदस्य में "पशु" उदाहरण नहीं हैं, बल्कि "प्रजाति" उदाहरण हैं, जो मेरे लिए बहुत अजीब थे। "बाहरी" सदस्य में "पशु" उदाहरण होते हैं। मुझे लगता है कि दो प्रतिनिधि निर्धारित करते हैं कि कौन सा जाता है और इससे क्या बाहर निकलता है?

  2. मैंने देखा कि यदि मैं "विशिष्ट" का उपयोग करता हूं, तो "आंतरिक" में 6 आइटम होते हैं (यह गलत है क्योंकि केवल 2 अलग हैं), लेकिन "बाहरी" में सही मान होते हैं। दोबारा, शायद प्रतिनिधि पद्धतियां इसे निर्धारित करती हैं लेकिन यह Inumerable के बारे में मुझे कुछ और पता है।

  3. सबसे महत्वपूर्ण बात यह है कि दो विकल्पों में से कौन सा सर्वश्रेष्ठ प्रदर्शन-वार है?

बुराई सूची रूपांतरण। .ToList() माध्यम से?

या शायद सीधे गणनाकर्ता का उपयोग कर?

यदि आप कर सकते हैं, तो कृपया थोड़ा सा समझाएं या कुछ लिंक फेंक दें जो IENumerable के इस उपयोग को समझाते हैं।


ऊपर पोस्ट किए गए सभी उत्तरों के अलावा, यहां मेरे दो सेंट हैं। सूची के अलावा कई अन्य प्रकार हैं जो IENumerable ऐसे आईसीओलेक्शन, ऐरेलिस्ट इत्यादि को लागू करते हैं। इसलिए यदि हमारे पास किसी भी विधि के पैरामीटर के रूप में IENumerable है, तो हम फ़ंक्शन में किसी संग्रह प्रकार को पास कर सकते हैं। आइए हम अबास्ट्रक्शन पर काम करने के लिए कोई विशिष्ट कार्यान्वयन नहीं कर सकते हैं।


एहसास करने की सबसे महत्वपूर्ण बात यह है कि, लिंक का उपयोग करके, क्वेरी का मूल्यांकन तुरंत नहीं किया जाता है। यह केवल परिणामी IEnumerable<T> माध्यम से पुनरावृत्ति के हिस्से के रूप में चलाया जाता है - यही वह अजीब प्रतिनिधि कर रहा है।

तो, पहला उदाहरण ToList को कॉल करके क्वेरी क्वेरी को तुरंत सूची में डालकर क्वेरी का मूल्यांकन करता है।
दूसरा उदाहरण एक IEnumerable<T> है जिसमें बाद में क्वेरी चलाने के लिए आवश्यक सभी जानकारी होती है।

प्रदर्शन के संदर्भ में, जवाब यह निर्भर करता है । यदि आपको परिणामों को एक बार में मूल्यांकन करने की आवश्यकता है (कहें, आप उन संरचनाओं को म्यूट कर रहे हैं जिन्हें आप बाद में पूछताछ कर रहे हैं, या यदि आप IEnumerable<T> लंबे समय तक लेने के लिए पुनरावृत्ति नहीं चाहते हैं) सूची का उपयोग करें । अन्यथा एक IEnumerable<T> उपयोग करें। डिफॉल्ट को दूसरे उदाहरण में ऑन-डिमांड मूल्यांकन का उपयोग करना चाहिए, क्योंकि आमतौर पर कम स्मृति का उपयोग करता है, जब तक कि सूची में परिणामों को संग्रहीत करने का कोई विशिष्ट कारण न हो।


किसी ने भी एक महत्वपूर्ण अंतर का जिक्र नहीं किया, इस पर एक डुप्लिकेट के रूप में बंद एक प्रश्न पर विडंबनात्मक रूप से उत्तर दिया।

IENumerable केवल पढ़ने के लिए है और सूची नहीं है।

सूची और IENumerable के बीच व्यावहारिक अंतर देखें


यदि आप जो करना चाहते हैं, उन्हें IEnumerable , तो IEnumerable उपयोग करें।

सावधान रहें, हालांकि, मूल संग्रह को बदलना एक खतरनाक ऑपरेशन है - इस मामले में, आप पहले सूची करना चाहते हैं। यह स्मृति में प्रत्येक तत्व के लिए एक नया सूची तत्व बनाएगा, जो कि IEnumerable आकलन करता है और यदि आप केवल एक बार गणना करते हैं तो कम प्रदर्शनकर्ता होता है - लेकिन सुरक्षित और कभी-कभी List विधियां आसान होती हैं (उदाहरण के लिए यादृच्छिक पहुंच में)।


यहां एक बहुत अच्छा लेख लिखा गया है: क्लाउडियो बर्नास्कोनी का टेकब्लॉग यहां: आईन्यूमेरेबल, आईसीओलेक्शन, आईलीस्ट और लिस्ट का उपयोग कब करें

यहां कुछ मूलभूत बातें परिदृश्य और कार्यों के बारे में बताती हैं:





ienumerable