2010-12-02 2 views
14

यदि मेरे पास foreach लूप है, तो क्या बूलियन की जांच करने का कोई तरीका है?क्या 'फोरच' लूप के लिए एक शर्त जांच हो सकती है?

मैं foreach() के अंदर एक बार जांचना नहीं चाहता और फिर उदाहरण के लिए तोड़ना चाहता हूं। मैं संग्रह पर foreach करना चाहता हूं और साथ ही कुछ वास्तविक होने पर मूल्यांकन करना चाहता हूं।

उदाहरण के लिए, मैं नहीं चाहता कि क्या करना चाहते हैं:

IEnumerable<Job> jobs = currentJobs; 

    foreach(Job job in jobs) 
    { 
     if (found) 
      break; 
    } 
+0

आपको एक उदाहरण प्रदान कर सकता है? मैं तुम्हारा क्या मतलब है पर थोड़ा अस्पष्ट हूं ... जिसका मतलब है कि अन्य लोग शायद भ्रमित भी हैं। –

+0

क्या आप अधिक जानकारी और/या उदाहरण प्रदान कर सकते हैं? – LukeH

+1

आपका मतलब है foreach (varList में var आइटम। जहां (स्थिति)) – Kikaimaru

उत्तर

14

तुम हमेशा पाश के लिए एक में बदल सकता है।

for (i = 0; i < jobs.Count && booleanTrue; i++) { 
// do a lot of great stuff 
} 

तुम भी IEnumerable से IList को नौकरी बदलने की आवश्यकता होगी। मुझे लगता है कि IList आपके उद्देश्यों को बेहतर तरीके से पूरा करेगा। IEnumerable आलसी तत्वों का मूल्यांकन करने से पहले तत्वों का मूल्यांकन करता है और इसमें संबंधित संग्रह सहायक विधियां शामिल नहीं होती हैं।

+3

आप केवल तभी ऐसा कर सकते हैं जब संग्रह 'गणना' संपत्ति प्रदान करता है (और संभावित रूप से "बहुत सारी चीज़ें" करने के बाद से एक सूचकांक भी सूचकांक द्वारा तत्वों तक पहुंचने की आवश्यकता होगी)। प्रश्न में उदाहरण 'IENumerable ' का उपयोग करता है, जिसमें या तो नहीं है। – LukeH

+0

आह, ठीक है। जब मैंने जवाब दिया तो उसके पास उस उदाहरण को पोस्ट नहीं किया गया था। मैंने अपना जवाब तय कर लिया है। –

1

नहीं, एक foreach बस प्रत्येक तत्व के लिए काम करता है।

आप नियमित for(a; b; c) लूप में कई स्थितियों को जोड़ सकते हैं। for(a; b && x; c)

9

इसे बहुत प्यार नहीं है, लेकिन शायद कुछ LINQ?

bool yourBool = false; 
foreach(var item in 
    collection.TakeWhile(x => yourBool)) 
{...} 

?

+2

यह एक जारी है, एक ब्रेक नहीं। –

+0

@ हेंक - बेहतर? –

+1

@ हेंक - और निष्पक्ष होने के लिए, जब तक कि उदाहरण जोड़ा गया था, इरादा संदिग्ध था। –

11

TakeWhile का उपयोग करने का प्रयास करें।

उदाहरण से:

string[] fruits = { "apple", "banana", "mango", "orange", 
          "passionfruit", "grape" }; 

    IEnumerable<string> query = 
     fruits.TakeWhile(fruit => String.Compare("orange", fruit, true) != 0); 

    foreach (string fruit in query) 
    { 
     Console.WriteLine(fruit); 
    } 

     /* 
     This code produces the following output: 

     apple 
     banana 
     mango 
     */ 
+0

मेरी इच्छा है कि मैं इसे दो बार बढ़ा सकता हूं। –

2

हूँ मैं सही ढंग से समझ है कि आप

  1. तत्वों की एक अनुक्रम
  2. प्रत्येक तत्व
  3. के साथ कुछ कार्रवाई करना चाहते हैं, लेकिन आप करना चाहते हैं आपके द्वारा सामना किए जाने वाले पहले तत्व को तोड़ दें जिसके लिए कुछ शर्त सच है?

मुझे foreach लूप का उपयोग करने के प्रतिरोध को समझ में नहीं आता है; मैं या तो आपके पास क्या है के साथ चिपके रहते हैं या

foreach(var job in jobs.TakeWhile(x => someCondition(x)) { 
    someAction(job); 
} 
5

मैं एक और दृष्टिकोण पाया:

 foreach (var car in cars) if (!rentedCars.Contains(car)) 
     { 
      // Magic 
     } 
+0

मुझे लगता है कि यह जवाब होना चाहिए। फिर भी यही वह है जिसे मैं ढूंढ रहा हूं। धन्यवाद! – AdorableVB

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