Как выйти из цикла foreach в 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 #?
Тим Пицкер
8
@ Тим Пицкер: Конечно, есть, см. Ответ спонсора. Фактически, после привыкания к Linq большая часть императивного кода выглядит как наскальные рисунки.
R0MANARMY

Ответы:

221
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;
mbillard
источник
6
Я бы посоветовал переписать второй пример наbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR
83

Используйте, break;и это выйдет из цикла foreach

Фрэнсис Гилберт
источник
55

Вы можете избежать явных циклов, выбрав маршрут LINQ:

sList.Any(s => s.Equals("ok"))
расточитель
источник
23
или просто используйте Contains("ok").
Грэм Кларк
7
@ Грэм Кларк: Containsпредполагается, что вы повторяете файл ICollection<T>. Anyбудет работать со всем, что имеет тип IEnumerable<T>, и в этом случае вопрос явно не указывает, какой тип коллекции он выполняет итерацию ( Listхотя a - довольно справедливое предположение).
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, очевидно, завершит всю функцию. Судя по вашему вопросу, вы можете использовать return true; заявление.

Cody
источник
7

Вы можете использовать, breakкоторый выпрыгивает из ближайшего охватывающего цикла, или вы можете простоreturn true

vrxacs
источник
5

Используйте оператор break. Мне смешно, что ответ на ваш вопрос буквально находится в вашем вопросе! Кстати, ответ мог бы дать простой поиск в Google.

dynamichael
источник
3

как насчет:

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

Это должно помочь, если все, что вы хотите сделать, это проверить наличие «ок» и вернуть ответ ...

Дэн Олесен
источник
2

Это не прямой ответ на ваш вопрос, но есть гораздо более простой способ сделать то, что вы хотите. Если вы используете .NET 3.5 или новее, по крайней мере. Он называется Enumerable.Contains.

bool found = sList.Contains("ok");
Может Gencer
источник
1
foreach(string s in sList)
{
    if(s.equals("ok"))
    {
             return true;
    }
}
return false;
harryovers
источник
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