2010-06-22 15 views
21

तार्किक रूप से, कोई सोचता है कि सी # में फ़ोरैच लूप लूप के लिए वृद्धि के समान क्रम में मूल्यांकन करेगा। प्रयोगात्मक रूप से, यह करता है। हालांकि, एमएसडीएन साइट पर ऐसी कोई पुष्टि नहीं होती है।क्या सी # में फोरैच लूप मूल्यांकन के आदेश की गारंटी देता है?

क्या यह इतना स्पष्ट उत्तर है कि उन्होंने साइट पर उस जानकारी को शामिल करने के बारे में नहीं सोचा था? या क्या संभावना है कि यह गलत तरीके से व्यवहार करेगा?

उत्तर

35

सरणी के लिए (ध्यान दें कि System.ArrayIEnumerable लागू करता है), यह क्रम में तत्वों तक पहुंच जाएगा। अन्य प्रकारों के लिए (IEnumerable, या GetEnumerator), यह MoveNext और Current कॉल के माध्यम से प्रदान किए गए क्रम में तत्वों तक पहुंचता है।

मानक राज्यों (ECMA-364 §15.8.4):

"जिस क्रम में foreach एक सरणी के तत्वों को पार करता, के रूप में है इस प्रकार है: एक आयामी सरणी के लिए तत्व हैं सूचकांक बढते क्रम, सूचकांक 0 और सूचकांक की लंबाई के साथ समाप्त होने के साथ शुरू में चल - 1. बहुआयामी सरणियों के लिए, तत्व इस तरह आगे बढ़ते जाते हैं कि दायीं आयाम के सूचकांकों पहले, फिर अगले बाईं आयाम बढ़ रहे हैं , और इतने पर बाईं तरफ। "

5

इसके लायक होने के लिए, आप इसे Reflector में बहुत कुछ देख सकते हैं। mscorlib में, System.Array लागू IEnumerable (जैसा कि बताया गया है), और Array#GetEnumeratorArrayEnumerator देता है। यहाँ ArrayEnumerator#MoveNext के शरीर है:

public bool MoveNext() 
{ 
    if (this._complete) 
    { 
     this.index = this.endIndex; 
     return false; 
    } 
    this.index++; 
    this.IncArray(); 
    return !this._complete; 
} 

स्पष्ट रूप से एक उदाहरण है कि है, लेकिन जवाब है: यह implementer पर निर्भर है और आप, या स्रोत निरीक्षण, कुछ मामलों में से जिस तरह से वे प्रयोगात्मक काम का सबसे पता कर सकते हैं ।

11

foreachIEnumerable<T> के शीर्ष पर बनाया गया है MSDN पर प्रगणक के लिए अनुबंध का कहना है

प्रारंभ में, प्रगणक संग्रह में पहला तत्व से पहले स्थिति में है। ... इसलिए, आपको वर्तमान के मूल्य को पढ़ने से पहले संग्रह के पहले तत्व में गणनाकर्ता को अग्रिम करने के लिए MoveNext को कॉल करना होगा।

वर्तमान में वही ऑब्जेक्ट देता है जब तक MoveNext को कॉल नहीं किया जाता है। MoveNext अगले तत्व पर वर्तमान सेट करता है।

तो अगर अंतर्निहित संग्रह स्पष्ट 'पहली' तत्व है, और प्रत्येक तत्व एक स्पष्ट 'अगले' तत्व है, के रूप में सरणियों, सूचियों के लिए मामला है और इतने पर, तो आप उस foreach व्यवहार करने के लिए उम्मीद कर सकते हैं तार्किक और स्थिरता से। यदि यह एक सेट की तरह कुछ है, जिसमें कोई पहला या अगला अनुक्रम नहीं है, तो यह एक अस्थिर तरीके से व्यवहार कर सकता है, हालांकि संभावित रूप से आईन्यूमेरेबल के राज्य को बदलने के बिना भी संग्रह जो कि कोई परिभाषित आदेश नहीं है, क्योंकि उन्हें असंगत बनाना अधिक होगा काम!

3

फोरैच पर चेतावनी हैश एरेज़ हैं जहां आदेश की गारंटी नहीं है ... हैश कुंजी।

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