2010-10-14 12 views
18

अगर मैं एक तरह पाश के लिए निम्नलिखित:क्या यह फ़ोरैच लूप कॉल स्प्लिट() प्रत्येक पुनरावृत्ति सी # में होगा?

foreach(string email in installerEmails.Split(',')) 
{ 
    Console.WriteLine(email); 
} 

स्प्लिट() कॉल पाश से प्रत्येक यात्रा पर कराई जाएगी? क्या मुझे इसे इसके माध्यम से पहले एक अस्थायी सरणी में स्टोर करने की आवश्यकता है?

+3

+1: अच्छा प्रश्न –

+1

संभावित डुप्लिकेट [फ़ोरैच फ़ंक्शन के माध्यम से लूपिंग करते समय फ़ोरैच कैसे काम करता है?] (Http://stackoverflow.com/questions/1632810/how-does-foreach-work-when-looping-through -फंक्शन-परिणाम) –

उत्तर

26

नहीं। यह उस कॉल के परिणामस्वरूप फिर से चालू होगा, यानी Split का रिटर्न प्रकार जो एक स्ट्रिंग सरणी है: string[]

1

Split जो एक सरणी में परिणाम एक बार बुलाया जाएगा,। foreach तो सरणी पर पुनरावृति के लिए एक एकल प्रगणक उपयोग करता है।

+4

इसे किस से अनुकूलित करें? यह पहली जगह में लूप को परिभाषित कर रहा है। –

+0

@ जोन हन्ना: मेरी गलती, मैं एक सेकंड के लिए थोड़ी देर के लूप के संदर्भ में सोच रहा था। यह वहां कुछ भी अनुकूलित नहीं करेगा, जो 'while' के उद्देश्य को हरा देगा :) मैंने इसे अपने उत्तर से हटा दिया है, धन्यवाद। –

4

नहीं। बस अपने कोड डीबग। आप देखेंगे स्प्लिट() विधि केवल एक बार बुलाया जाता है।

0

सं .Split() एक IEnumerable देता है, और उस पर पुनरावृति करने के लिए इस्तेमाल किया जाएगा।

5

स्प्लिट का परिणाम इस पर कहा जाता है एक बार मूल्यांकन किया जाता है, तो GetEnumerator()। यह एक आईन्यूमेरेटर देता है जिस पर प्रत्येक पुनरावृत्ति में MoveNext विधि और वर्तमान प्रॉपर्टी को कॉल किया जाता है।

यह मूल रूप से करने के लिए बराबर है:

string[] enumerable=installerEmails.Split(','); 
IEnumerator<string> enumerator=enumerable.GetEnumerator(); 
while(enumerator.MoveNext()) 
{ 
    string email=(string)enumerator.Current; 
    Console.WriteLine(email); 
} 

एक बदसूरत विस्तार प्रकार आप पाश के लिए संकलक उत्पन्न करता है में देने के लिए स्पष्ट डाली है। यह सी # 1.0 में उपयोगी था जहां आईनेमेरेटर सामान्य नहीं था।

मैं भूल गया था कि गणनाकार निपटारा हो जाता है। कोड के लिए जॉन हन्ना का जवाब देखें जिसमें निपटान शामिल है।

3

नहीं स्प्लिट द्वारा लौटाई गई वस्तु (जो एक सरणी होती है, लेकिन यह अन्य समसामयिक वस्तुओं पर लागू होती है) जो लूप को सभी के बाद परिभाषित करती है। यदि इसमें शून्य या दस लाख वस्तुएं हैं, तो यह शून्य या लाख पुनरावृत्तियों को परिभाषित कर रहा है, जो इसे तब तक नहीं किया जा सकता जब इसे बुलाया जा सके।

थोड़ा अधिक विस्तार के लिए, कोड उत्पादन के बराबर हो जाता है:

string[] temp = installerEmails.Split(','); 
var enumerator = temp.GetEnumerator(); 
try 
{ 
    while(enumerator.MoveNext()) 
    { 
    string email = (string)enumerator.Current; 
    Console.WriteLine(email); 
    } 
} 
finally 
{ 
    if(enumerator is IDisposable) 
    ((IDisposable)enumerator).Dispose() 
} 

आप देख सकते हैं, .Split() केवल एक बार कहा जाता है।

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