Як я вискочую з циклу foreach у C #?


124

Як вийти з 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 #?
Тім Піцкер

8
@Tim Pietzcker: Звичайно, є, дивіться відповідь Spender. Насправді, після звикання до Linq, багато імперативного коду виглядає як печерні малюнки.
R0MANARMY

Відповіді:


220
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").
Грем Кларк

7
@Graham Clark: Containsпередбачає, що ви повторюєте ICollection<T>. Anyбуде працювати над будь-яким типом IEnumerable<T>, і в цьому випадку питання прямо не вказує, над якою колекцією він повторюється ( 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 або новішу версію, принаймні. Він називається « Безліч»

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 guy. але тут достатньо коду, щоб застосувати робоче рішення ... я видалив $ і додав var .. напевно, все ще не c +
johnny craig

насправді varце абсолютно правильне ключове слово C #, тож вам добре
R0MANARMY
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.