IEnumerable का समर्थन करने वाले संग्रह के माध्यम से लूप कैसे करें?


90

IEnumerable का समर्थन करने वाले संग्रह के माध्यम से लूप कैसे करें?

जवाबों:


155

प्रत्येक के लिए एक नियमित करेगा:

foreach (var item in collection)
{
    // do your stuff   
}

यह .ElementAt () से अधिक तेज़ है। दुर्भाग्य से, मेरा वोट एलेक्सा के जवाब पर बंद है, इसलिए मैं इसे पूर्ववत नहीं कर सकता लेकिन यह सबसे अच्छा जवाब है। +1
लियो गुरदियन

तो फिर आप "IEnumerable के संभावित कई गणन" को कैसे ठीक करते हैं?
शार्प

1
@SharpC: सबसे आसान तरीका है कि परिणाम को सूची <T> या एक सरणी में खींच लिया जाए, और फिर इसे उन विभिन्न स्थानों पर पास कर दिया जाए जिन पर इसे पुन: प्रसारित करने की आवश्यकता है। यह गारंटी देता है कि (संभावित रूप से महंगा) परिणाम की गणना केवल एक बार होती है, लेकिन परिणाम को स्मृति में संग्रहीत करने की कीमत पर। मेरा पहला कदम यह पता लगाना होगा कि वास्तव में एक से अधिक गणन समस्या है या नहीं।
फ्रेड्रिक मोर्क

94

एक foreachलूप का उपयोग करने के पहले से ही सुझाए गए तरीकों के साथ , मैंने सोचा कि मैं यह भी उल्लेख करूंगा कि किसी भी वस्तु को लागू करने वाला IEnumerableभी विधि के IEnumeratorमाध्यम से एक इंटरफ़ेस प्रदान करता है GetEnumerator। हालांकि यह विधि आमतौर पर आवश्यक नहीं है, इसका उपयोग मैन्युअल रूप से संग्रह पर पुनरावृत्ति के लिए किया जा सकता है, और संग्रह के लिए अपने स्वयं के विस्तार के तरीकों को लिखते समय विशेष रूप से उपयोगी है।

IEnumerable<T> mySequence;
using (var sequenceEnum = mySequence.GetEnumerator())
{
    while (sequenceEnum.MoveNext())
    {
        // Do something with sequenceEnum.Current.
    }
}

एक प्रमुख उदाहरण है जब आप समवर्ती रूप से दो अनुक्रमों पर पुनरावृति करना चाहते हैं , जो एक foreachलूप के साथ संभव नहीं है ।


7
गणना करने वाले को निपटाना न भूलें।
एरिक लिपर्ट

@ एरिक: हां, मैं इसे जोड़ दूंगा क्योंकि इसमें चूक करना आसान है।
Noldorin

1
मुझे लगता है कि यह केवल IEnumerable <T> वस्तुओं के लिए काम करेगा और IEnumerable के लिए नहीं। मेरे पास एक सामान्य मामला था जिसमें मुझे IEnumerable को कास्ट करना था और इसलिए, मेरे पास GetEnumer Method उपलब्ध नहीं था। वैसे भी ज्यादातर मामलों के लिए अच्छा है।
फैबियो मिल्हीरो

50

या यहां तक ​​कि एक बहुत पुरानी पुरानी फैशन पद्धति

IEnumerable<string> collection = new List<string>() { "a", "b", "c" };

for(int i = 0; i < collection.Count(); i++) 
{
    string str1 = collection.ElementAt(i);
    // do your stuff   
}

शायद आप इस विधि को भी पसंद करेंगे :-)


9
यह इतने सारे अपवित्र क्यों है? यह एक बार के बजाय 2 एन गणना योग्य होगा।
रोमन रेनर

1
@ रोमिनर क्योंकि यह काम करता है, कुछ लोग प्रदर्शन के बारे में परेशान नहीं होते हैं :)
Khateeb321

@RomanReiner यह अच्छा उदाहरण है, मुझे एक संग्रह के प्रत्येक तत्व को दूसरे संग्रह में निर्दिष्ट करने की आवश्यकता है, मुझे लगता है कि मैं इसे foreach का उपयोग नहीं कर सकता
AminM

1
यदि आप ElementAt के कार्यान्वयन को देखते हैं, तो आपको पता चलेगा कि यदि संग्रह एक IList है, तो वे तत्व का उपयोग कर सूचकांक में वापस लौटाते हैं]; हालांकि [], के रूप में एक ही प्रदर्शन; यदि नहीं, तो वे एन्यूमरेटर प्राप्त करेंगे और इसे वापस करने से पहले तत्व की तलाश करते हुए एक पुनरावृत्ति शुरू करेंगे, इसलिए मूल रूप से प्रत्येक तत्व के लिए वे एक नया एन्यूमरेटर बनाते हैं और सूची को फिर से नेविगेट करते हैं ...
इज़राइल गार्सिया

1
यह सब से भी बदतर है, IEnumerable काउंट () या ElementAt () का समर्थन नहीं करता है। मुझे लगता है कि वह एक आईएलस्ट के बारे में सोच रहा है। यह वास्तव में इस सवाल का जवाब नहीं है।
क्रोव


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.