Как выйти из цикла 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;

6
Я бы посоветовал переписать второй пример наbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR


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; заявление.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.