ฉันจะกระโดดออกจาก foreach loop ใน C # ได้อย่างไร


125

ฉันจะแยกออกจากforeachลูปใน C # ได้อย่างไรหากองค์ประกอบใดองค์ประกอบหนึ่งตรงตามข้อกำหนด

ตัวอย่างเช่น:

foreach(string s in sList){
      if(s.equals("ok")){
       //jump foreach loop and return true
     }
    //no item equals to "ok" then return false
}

ตลก. ใน Python คุณก็ทำreturn "ok" in sList:- ไม่มีอะไรเทียบได้ใน C #?
Tim Pietzcker

8
@ Tim Pietzcker: แน่นอนดูคำตอบของอะไรต่อมิอะไร ในความเป็นจริงหลังจากที่คุ้นเคยกับ Linq รหัสจำเป็นจำนวนมากดูเหมือนภาพวาดในถ้ำ
R0MANARMY

คำตอบ:


222
foreach (string s in sList)
{
    if (s.equals("ok"))
        return true;
}

return false;

หรือหากคุณต้องการทำสิ่งอื่น ๆ หลังจากที่คุณพบรายการ:

bool found = false;
foreach (string s in sList)
{
    if (s.equals("ok"))
    {
        found = true;
        break; // get out of the loop
    }
}

// do stuff

return found;

6
ฉันขอแนะนำว่าตัวอย่างที่สองจะเขียนใหม่ได้ดีกว่าbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR


55

คุณสามารถหลีกเลี่ยงการวนซ้ำอย่างชัดเจนได้โดยใช้เส้นทาง LINQ:

sList.Any(s => s.Equals("ok"))

23
Contains("ok")หรือการใช้งานเพียงแค่
Graham Clark

7
@Graham Clark: Containsสมมติว่าคุณกำลังทำซ้ำในICollection<T>ไฟล์. Anyจะทำงานกับอะไรก็ได้ที่เป็นประเภทIEnumerable<T>และในกรณีนี้คำถามไม่ได้ระบุอย่างชัดเจนว่าคอลเล็กชันประเภทใดที่ทำซ้ำ (a Listเป็นการเดาที่ค่อนข้างยุติธรรม)
R0MANARMY

32
foreach (var item in listOfItems) {
  if (condition_is_met)
    // Any processing you may need to complete here...
    break; // return true; also works if you're looking to
           // completely exit this function.
}

ควรทำเคล็ดลับ คำสั่ง break จะยุติการทำงานของลูปในขณะที่คำสั่ง return จะยุติฟังก์ชันทั้งหมดอย่างเห็นได้ชัด เมื่อพิจารณาจากคำถามของคุณคุณอาจต้องการใช้ผลตอบแทนจริง คำให้การ.


7

คุณสามารถใช้breakสิ่งที่กระโดดออกจากลูปปิดล้อมที่ใกล้ที่สุดหรือจะใช้โดยตรงก็ได้return true


5

ใช้คำสั่ง 'break' ฉันคิดว่าเป็นเรื่องตลกที่คำตอบสำหรับคำถามของคุณอยู่ในคำถามของคุณ! อย่างไรก็ตามการค้นหาง่ายๆโดย Google อาจให้คำตอบแก่คุณได้


3

เกี่ยวกับ:

return(sList.Contains("ok"));

ที่ควรทำเคล็ดลับหากสิ่งที่คุณต้องการทำคือตรวจสอบ "ตกลง" และส่งคืนคำตอบ ...


2

ไม่ใช่คำตอบโดยตรงสำหรับคำถามของคุณ แต่มีวิธีที่ง่ายกว่ามากในการทำสิ่งที่คุณต้องการ หากคุณใช้. NET 3.5 หรือใหม่กว่าอย่างน้อย. มันถูกเรียกว่าEnumerable.Contains

bool found = sList.Contains("ok");


1

กลับออกจากลูปโดยตรง:

foreach(string s in sList){
   if(s.equals("ok")){
      return true;
   }
}

// if you haven't returned by now, no items are "ok"
return false;

หรือใช้break:

bool isOk = false;
foreach(string s in sList){
   if(s.equals("ok")){
      isOk = true;
      break; // jump out of the loop
   }
}

if(isOk)
{
    // do something
}

อย่างไรก็ตามในกรณีของคุณอาจเป็นการดีกว่าที่จะทำสิ่งนี้:

if(sList.Contains("ok"))
{
    // at least one element is "ok"
}
else
{
   // no elements are "ok"
}

-2
var ind=0;
foreach(string s in sList){
    if(s.equals("ok")){
        return true;
    }
    ind++;
}
if (ind==sList.length){
    return false;
}

$ค่อนข้างแน่ใจว่าไม่ใช่ไวยากรณ์ C # ที่ถูกต้อง
R0MANARMY

อาจจะไม่ใช่ฉันเป็นคนที่แต่งตัวประหลาด Javascript / php แต่มีรหัสเพียงพอที่จะใช้โซลูชันที่ใช้งานได้ที่นี่ ... ฉันลบ $ และเพิ่ม var .. อาจจะยังไม่ใช่ c +
johnny Craig

จริงๆแล้วvarเป็นคำหลัก C # ที่ถูกต้องอย่างสมบูรณ์ดังนั้นคุณจึงดี
R0MANARMY
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.