2011-11-11 13 views
5

में संग्रह का उपयोग मैं फ़ोरैच लूप में संग्रह के माध्यम से पुनरावृत्ति कर रहा हूं और सोच रहा था। इस .NET रनटाइमफ़ोरैच लूप

foreach (object obj in myDict.Values) { 
    //... do something 
} 

द्वारा क्रियान्वित हो जाने पर myDict.Values ​​हर पाश के लिए लागू करने के है या यह केवल एक बार कहा जाता है?

धन्यवाद,

उत्तर

9

बस एक बार। यह लगभग बराबर है:

using (IEnumerator<Foo> iterator = myDict.Values.GetEnumerator()) 
{ 
    while (iterator.MoveNext()) 
    { 
     object obj = iterator.Current; 
     // Body 
    } 
} 

अधिक जानकारी के लिए सी # 4 स्पेक के अनुभाग 8.8.4 देखें। विशेष रूप से, अनुमानित पुनरावृत्ति तत्व प्रकार, निपटान, और कैसे सी # कंपाइलर foreach प्रकारों पर लूप को संभालता है जो IEnumerable या IEnumerable<T> लागू नहीं करते हैं।

+1

मुझे यकीन है कि आप दिल से अनुभाग को जानते हैं :) –

+0

गहराई में सी # स्पेक के बजाय सी # स्पेक को उद्धृत करने के लिए आप में से कोई भी नहीं, दूसरा एड :) –

6

संक्षिप्त उत्तर: इसे केवल एक बार बुलाया जाता है।

+1

विस्तार करने के लिए: foreach Enumerator (आपके संग्रह पर IENumerable इंटरफेस के माध्यम से) पकड़ता है और लूप के माध्यम से प्रत्येक बार अगला() कॉल करता है। –

2

इसे एक बार बुलाया जाता है और संग्रह संशोधित होने पर अपवाद उत्पन्न करेगा।

+0

संशोधन पर निर्भर करता है। –

+0

हां, अच्छा बिंदु। यदि यह कक्षा में केवल एक मूल्य है तो यह इसे प्रभावित नहीं करेगा, लेकिन यदि संग्रह से आइटम जोड़े या हटा दिए जाते हैं तो यह एक समस्या है। – James

संबंधित मुद्दे