2011-08-16 17 views
10

लूप केस के लिए मैं इंडेक्स को कथन के बाहर घोषित कर सकता हूं। उदाहरण के लिए,फ़ोरैच लूप के बाहर परिवर्तनीय घोषित करें

for (int i = 0; i < 8; i++) { } 

के बजाय के लिए मैं कर सकते हैं:

int i; 
for (i = 0; i < 8; i++) { } 

अब पाश foreach की तुलना में, मैं पाश अंदर चर घोषित करने के लिए है:

foreach (string name in names) { } 

और मैं नहीं कर सकता कुछ ऐसा करें:

string name; 
foreach (name in names) { } 

कारण यह मुझे परेशान करता है कि लूप के बाद मैं चर "नाम" का उपयोग करना चाहता हूं। फोरैच लूप के मामले में वैरिएबल "नाम" का उपयोग फ़ोरैच स्कोप के बाहर से नहीं किया जा सकता है, और मैं उसी नाम के साथ एक और वैरिएबल घोषित नहीं कर सकता क्योंकि यह उसी दायरे में पहले घोषित किया गया था।

कोई विचार?

+1

आप सूची में पुनरावृत्त करने के लिए नाम का उपयोग करेंगे, आपको बाद में अपने कोड में इसका संदर्भ क्यों देना होगा। मुझे लगता है कि आप इस तरह के उपयोग की आवश्यकता से बचने के लिए कोड कर सकते हैं। –

+0

@ शिमिम हाफिज: मेरे पास एक ऐसा मामला है जहां मैं फोरैच लूप में समान नाम के साथ एक वैरिएबल पसंद करता हूं। – Naor

+0

मुझे एक ही समस्या थी। मैं कोशिश-पकड़ के अंदर एक फ़ोरैच लूप का उपयोग करता हूं और मैं कोशिश और पकड़ ब्लॉक दोनों के अंदर एक लॉग में लिखता हूं। मैं दोनों लॉग के अंदर foreach पाश में आइटम चर का उपयोग करें। मैं जॉन स्कीट की पहली दो विधियों में बदलाव का उपयोग कर समाप्त हुआ। – seebiscuit

उत्तर

11

ठीक है, आप कर सकते हैं:

string name = null; // You need to set a value in case the collection is empty 
foreach (string loopName in names) 
{ 
    name = loopName; 
    // other stuff 
} 

या अधिक होने की संभावना:

string name = null; // You need to set a value in case the collection is empty 
foreach (string loopName in names) 
{ 
    if (someCondition.IsTrueFor(loopName) 
    { 
     name = loopName; 
     break; 
    } 
} 

हैं foreach पाश की सामग्री जूस है टी एक मिलान तत्व को खोजने के लिए - जो कम से कम लगता संभावना - तो आप पर विचार करना चाहिए कि क्या LINQ एक बेहतर मैच होगा:

string name = names.Where(x => x.StartsWith("Fred")) 
        .FirstOrDefault(); 

का प्रयोग LINQ अक्सर कोड जो मूल रूप से कुछ खोजने की कोशिश कर रहा है कर सकते हैं एक बहुत पढ़ने के लिए आसान है।

+0

खोज यहां समस्या नहीं है, लेकिन आप अच्छे कामकाज प्रदान करते हैं। – Naor

1

आप इसे foreach loops में नहीं कर सकते हैं। आप एक श्रेणी चर का निर्माण और उपयोग कर रहे हैं जिसका दायरा foreach क्वेरी तक ही सीमित है।

आप नाम संग्रह के भीतर से एक व्यक्ति के नाम का उपयोग करने की जरूरत है, तो आप foreach पाश के बाहर एक मूल्य को असाइन कर सकें:

foreach(string name in names) 
{ 
    if(name == someCondition) 
     someVariable = name; 
} 
+0

ओपी ने बताया कि नाम foreach के शरीर से परे गुंजाइश पर बनी हुई है, क्या यह सच है? –

+1

@ शहीम। मेरे उदाहरण में, परिवर्तनीय नाम इस foreach पाश के बाहर दायरे में नहीं होगा। –

+0

आह ठीक है, मुझे लगता है कि ओपी फिर से "नाम" का उपयोग करने में सक्षम नहीं होने के बारे में गलत है। –

1

शायद?

string name; 
foreach (var tmp in names) { name = tmp; } 
+0

क्या आपने इसे आजमाया है? यह काम नहीं करता है। अगर यह था तो मैं इस सवाल को पोस्ट नहीं करूंगा। – Naor

+0

मुझे यकीन है कि आप मेरे स्निपेट से कुछ चूक गए हैं। असल में, यदि आप इसे चेक आउट करते हैं, तो यहां दिए गए सभी उत्तर कम से कम इस समाधान को देते हैं। अब, अगर आप नाइटपिक करना चाहते हैं, तो मैं शून्य असाइनमेंट चूक गया। – Vladimir

+0

आपको इसे foreach (नामों में स्ट्रिंग tmp) में बदलना है अन्यथा यह काम नहीं करेगा। विचार के लिए +1। – Naor

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