Как выйти из цикла foreach c
Перейти к содержимому

Как выйти из цикла foreach c

  • автор:

Как мне выйти из цикла foreach в C #?

@Tim Pietzcker: Конечно, смотрите ответ спонсора. Фактически, после привыкания к Linq, много императивного кода выглядит как наскальные рисунки.

R0MANARMY 28 июнь 2011, в 16:40
Поделиться:

11 ответов

Лучший ответ

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 28 июнь 2011, в 18:24
Поделиться

Я бы предложил второй пример лучше переписать в bool found = callFunctionInFirstCodeSnipper(list); // do stuff

ICR 28 июнь 2011, в 17:01

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

Francis Gilbert 28 июнь 2011, в 18:13
Поделиться

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

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

spender 28 июнь 2011, в 17:41
Поделиться
или просто используйте Contains(«ok») .
Graham Clark 28 июнь 2011, в 16:43

@Graham Clark: Contains предполагает, что вы перебираете ICollection . Any может работать с чем-либо, что относится к типу IEnumerable , и в этом случае вопрос явно не указывает, для какой коллекции он итерируется (хотя List довольно правдоподобно).

R0MANARMY 28 июнь 2011, в 16:46

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; утверждение.

Как выйти из цикла foreach c

Циклы являются управляющими конструкциями, позволяя в зависимости от определенных условий выполнять некоторое действие множество раз. В C# имеются следующие виды циклов:

Цикл for

Цикл for имеет следующее формальное определение:

for ([действия_до_выполнения_цикла]; [условие]; [действия_после_выполнения]) < // действия >

Объявление цикла for состоит из трех частей. Первая часть объявления цикла — некоторые действия, которые выполняются один раз до выполнения цикла. Обычно здесь определяются переменные, которые будут использоваться в цикле.

Вторая часть — условие, при котором будет выполняться цикл. Пока условие равно true , будет выполняться цикл.

И третья часть — некоторые действия, которые выполняются после завершения блока цикла. Эти действия выполняются каждый раз при завершении блока цикла.

После объявления цикла в фигурных скобках помещаются сами действия цикла.

Рассмотрим стандартный цикл for:

for (int i = 1; i

Здесь первая часть объявления цикла — int i = 1 — создает и инициализирует переменную i.

И третья часть — действия, выполняемые после завершения действий из блока цикла — увеличение переменной i на единицу.

Весь процесс цикла можно представить следующим образом:

В итоге блок цикла сработает 3 раза, пока значение i не станет равным 4. И каждый раз это значение будет увеличиваться на 1. Однократное выполнение блока цикла называется итерацией . Таким образом, здесь цикл выполнит три итерации. Результат работы программы:

1 2 3

Если блок цикла for содержит одну инструкцию, то мы можем его сократить, убрав фигурные свобки:

for (int i = 1; i < 4; i++) Console.WriteLine(i); // или так for (int i = 1; i < 4; i++) Console.WriteLine(i);

При этом необязательно именно в первой части цикла объявлять переменную, а в третий части изменять ее значение - это могут быть любые действия. Например:

var i = 1; for (Console.WriteLine("Начало выполнения цикла"); i < 4; Console.WriteLine($"i = "))

Здесь опять же цикл срабатывает, пока переменная i меньше 4, только приращение переменной i происходит в блоке цикла. Консольный вывод данной программы:

Начало выполнения цикла i = 2 i = 3 i = 4

Нам необязательно указывать все условия при объявлении цикла. Например, мы можем написать так:

int i = 1; for (; ;) < Console.WriteLine($"i = "); i++; >

Формально определение цикла осталось тем же, только теперь блоки в определении у нас пустые: for (; 😉 . У нас нет инициализированной переменной, нет условия, поэтому цикл будет работать вечно - бесконечный цикл.

Мы также можем опустить ряд блоков:

int i = 1; for (; i<4;) < Console.WriteLine($"i = "); i++; >

Этот пример по сути эквивалентен первому примеру: у нас также есть переменная-счетчик, только определена она вне цикла. У нас есть условие выполнения цикла. И есть приращение переменной уже в самом блоке for.

Также стоит отметить, что можно определять несколько переменных в объявлении цикла:

for (int i = 1, j = 1; i < 10; i++, j++) Console.WriteLine($"");

Здесь в первой части объявления цикла определяются две переменных: i и j. Цикл выполняется, пока i не будет равна 10. После каждой итерации переменые i и j увеличиваются на единицу. Консольный вывод программы:

1 4 9 16 25 36 49 64 81

Цикл do..while

В цикле do сначала выполняется код цикла, а потом происходит проверка условия в инструкции while. И пока это условие истинно, цикл повторяется.

do < действия цикла >while (условие)
int i = 6; do < Console.WriteLine(i); i--; >while (i > 0);

Здесь код цикла сработает 6 раз, пока i не станет равным нулю. Но важно отметить, что цикл do гарантирует хотя бы единократное выполнение действий, даже если условие в инструкции while не будет истинно. То есть мы можем написать:

int i = -1; do < Console.WriteLine(i); i--; >while (i > 0);

Хотя у нас переменная i меньше 0, цикл все равно один раз выполнится.

Цикл while

В отличие от цикла do цикл while сразу проверяет истинность некоторого условия, и если условие истинно, то код цикла выполняется:

while (условие)
int i = 6; while (i > 0)

Цикл foreach

Цикл foreach предназначен для перебора набора или коллекции элементов. Его общее определение:

foreach(тип_данных переменная in коллекция) < // действия цикла >

После оператора foreach в скобках сначала идет определение переменной. Затем ключевое слово in и далее коллекция, элементы которой надо перебрать.

При выполнении цикл последовательно перебирает элементы коллекции и помещает их в переменную, и таким образом в блоке цикла мы можем выполнить с ними некоторые действия.

Например, возьмем строку. Строка по сути - это коллекция символов. И .NET позволяет перебрать все элементы строки - ее символы с помощью цикла foreach .

foreach(char c in "Tom")

Здесь цикл foreach пробегается по всем символам строки "Tom" и каждый символ помещает в символьную переменную c . В блоке цикла значение переменной c выводится на консоль. Поскольку в строке "Tom" три символа, то цикл выполнится три раза. Консольный вывод программы:

T o m

Стоит отметить, что переменная, которая определяется в объявлении цикла, должна по типу соответствовать типу элементов перебираемой коллекции. Так, элементы строки - значения типа char - символы. Поэтому переменная c имеет тип char . Однако в реальности не всегда бывает очевидно, какой тип представляют элементы коллекции. В этом случае мы можем определить переменную с помощью оператора var :

foreach(var c in "Tom")

В дальнейшем мы подробнее рассмотрим, что представляют собой коллекции в .NET и какие именно коллекции можно перебирать с помощью цикла foreach .

Операторы continue и break

Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его завершения. В этом случае мы можем воспользоваться оператором break .

for (int i = 0; i

Хотя в условии цикла сказано, что цикл будет выполняться, пока счетчик i не достигнет значения 9, в реальности цикл сработает 5 раз. Так как при достижении счетчиком i значения 5, сработает оператор break, и цикл завершится.

0 1 2 3 4

Теперь поставим себе другую задачу. А что если мы хотим, чтобы при проверке цикл не завершался, а просто пропускал текущую итерацию. Для этого мы можем воспользоваться оператором continue :

for (int i = 0; i

В этом случае цикл, когда дойдет до числа 5, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующей итерации:

0 1 2 3 4 6 7 8

Стоит отметить, что операторы break и continue можно применять в любом типе циклов.

Вложенные циклы

Одни циклы могут быть вложенными в другие. Например:

for (int i = 1; i < 10; i++) < for (int j = 1; j < 10; j++) < Console.Write($"\t"); > Console.WriteLine(); >
  • Вопросы для самопроверки
  • Упражнения
  • Глава 1. Введение в C#
    • Язык C# и платформа .NET
    • Первая программа на C# с .NET CLI
    • Начало работы с Visual Studio. Первая программа
    • Первая программа на MacOS
    • Первая программа на Linux
    • Первое приложение в WSL
    • Структура программы
    • Переменные и константы
    • Литералы
    • Типы данных
    • Консольный ввод-вывод
    • Арифметические операции
    • Поразрядные операции
    • Операции присваивания
    • Преобразования базовых типов данных
    • Условные выражения
    • Конструкция if..else и тернарная операция
    • Циклы
    • Массивы
    • Задачи с массивами
    • Методы
    • Параметры методов
    • Возвращение значения и оператор return
    • Передача параметров по ссылке и значению. Выходные параметры
    • Массив параметров и ключевое слово params
    • Рекурсивные функции
    • Локальные функции
    • Конструкция switch
    • Перечисления enum
    • Классы и объекты
    • Конструкторы, инициализаторы и деконструкторы
    • Класс Program и метод Main. Программы верхнего уровня
    • Структуры
    • Типы значений и ссылочные типы
    • Область видимости (контекст) переменных
    • Пространства имен
    • Глобальные пространства имен
    • Подключение пространств имен по умолчанию
    • Создание библиотеки классов в Visual Studio
    • Создание библиотеки классов с помощью .NET CLI
    • Модификаторы доступа
    • Свойства
    • Перегрузка методов
    • Статические члены и модификатор static
    • Установка пакетов Nuget
    • Константы, поля и структуры для чтения
    • Null и ссылочные типы
    • Null и значимые типы
    • Проверка на null, операторы ?. и ??
    • Псевдонимы типов и статический импорт
    • Наследование
    • Преобразование типов
    • Виртуальные методы и свойства
    • Скрытие методов и свойств
    • Различие переопределения и скрытия методов
    • Абстрактные классы
    • Класс System.Object и его методы
    • Обобщенные типы
    • Ограничения обобщений
    • Наследование обобщенных типов
    • Конструкция try..catch..finally
    • Блок catch и фильтры исключений
    • Типы исключений. Класс Exception
    • Генерация исключения и оператор throw
    • Создание классов исключений
    • Поиск блока catch при обработке исключений
    • Делегаты
    • Применение делегатов
    • Анонимные методы
    • Лямбды
    • События
    • Ковариантность и контравариантность делегатов
    • Делегаты Action, Predicate и Func
    • Замыкания
    • Определение интерфейсов
    • Применение интерфейсов
    • Явная реализация интерфейсов
    • Реализация интерфейсов в базовых и производных классах
    • Наследование интерфейсов
    • Интерфейсы в обобщениях
    • Копирование объектов. Интерфейс ICloneable
    • Сортировка объектов. Интерфейс IComparable
    • Ковариантность и контравариантность обобщенных интерфейсов
    • Определение операторов
    • Перегрузка операций преобразования типов
    • Индексаторы
    • Переменные-ссылки и возвращение ссылки
    • Методы расширения
    • Частичные классы и методы
    • Анонимные типы
    • Кортежи
    • Records
    • Паттерн типов
    • Паттерн свойств
    • Паттерны кортежей
    • Позиционный паттерн
    • Реляционный и логический паттерны
    • Паттерны списков
    • Список List
    • Двухсвязный список LinkedList
    • Очередь Queue
    • Стек Stack
    • Словарь Dictionary
    • Класс ObservableCollection
    • Интерфейсы IEnumerable и IEnumerator
    • Итераторы и оператор yield
    • Строки и класс System.String
    • Операции со строками
    • Форматирование и интерполяция строк
    • Класс StringBuilder
    • Регулярные выражения
    • Структура DateTime
    • Форматирование дат и времени
    • DateOnly и TimeOnly
    • Отложенная инициализация и тип Lazy
    • Математические вычисления и класс Math
    • Преобразование типов и класс Convert
    • Класс Array и массивы
    • Span
    • Индексы и диапазоны
    • Введение в многопоточность. Класс Thread
    • Создание потоков. Делегат ThreadStart
    • Потоки с параметрами и ParameterizedThreadStart
    • Синхронизация потоков
    • Мониторы
    • Класс AutoResetEvent
    • Мьютексы
    • Семафоры
    • Задачи и класс Task
    • Работа с классом Task
    • Задачи продолжения
    • Класс Parallel
    • Отмена задач и параллельных операций. CancellationToken
    • Асинхронные методы, async и await
    • Возвращение результата из асинхронного метода
    • Последовательное и параллельное выполнение. Task.WhenAll и Task.WhenAny
    • Обработка ошибок в асинхронных методах
    • Асинхронные стримы
    • Основы LINQ
    • Проекция данных
    • Фильтрация коллекции
    • Сортировка
    • Объединение, пересечение и разность коллекций
    • Агрегатные операции
    • Получение части коллекции
    • Группировка
    • Соединение коллекций
    • Проверка наличия и получение элементов
    • Отложенное и немедленное выполнение LINQ
    • Делегаты в запросах LINQ
    • Введение в Parallel LINQ. Метод AsParallel
    • Метод AsOrdered
    • Обработка ошибок и отмена параллельных операции
    • Введение в рефлексию. Класс System.Type
    • Применение рефлексии и исследование типов
    • Исследование методов и конструкторов с помощью рефлексии
    • Исследование полей и свойств с помощью рефлексии
    • Динамическая загрузка сборок и позднее связывание
    • Атрибуты в .NET
    • DLR в C#. Ключевое слово dynamic
    • DynamicObject и ExpandoObject
    • Использование IronPython в .NET
    • Сборщик мусора в C#
    • Финализируемые объекты. Метод Dispose
    • Конструкция using
    • Указатели
    • Указатели на структуры, члены классов и массивы
    • Работа с дисками
    • Работа с каталогами
    • Работа с файлами. Классы File и FileInfo
    • FileStream. Чтение и запись файла
    • Чтение и запись текстовых файлов. StreamReader и StreamWriter
    • Бинарные файлы. BinaryWriter и BinaryReader
    • Архивация и сжатие файлов
    • Сериализация в JSON. JsonSerializer
    • XML-Документы
    • Работа с XML с помощью System.Xml
    • Изменение XML-документа
    • XPath
    • Linq to Xml. Создание Xml-документа
    • Выборка элементов в LINQ to XML
    • Изменение документа в LINQ to XML
    • Сериализация в XML. XmlSerializer
    • Процессы
    • Домены приложений
    • AssemblyLoadContext и динамическая загрузка и выгрузка сборок
    • Native AOT
    • Нововведения в C# 11
    • Нововведения в C# 12

    Помощь сайту
    410011174743222
    Перевод на карту
    Номер карты:
    4048415020898850

    Контакты для связи: metanit22@mail.ru

    Copyright © metanit.com, 2023. Все права защищены.

    Завершить принудительно foreach

    Подскажите есть ли способ принудительно завершить цикл foreach?
    Например тогда когда нужный элемент был найден, и все действия с ним были выполнены, чтобы дальше не перебирать элементы цикла - выйти.

    Лучшие ответы ( 1 )
    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    Как принудительно завершить выполнение программы?
    class Program < static void Main(string args) < Triangle T =.

    Как принудительно завершить поток скачивания
    Пишу утилиту по скачиванию файлов. Нужно, чтобы по нажатию кнопки Pause закачка прекращалась, без.

    Как принудительно завершить функцию recvfrom
    Добрый день. Подскажите как завершить ф-н recvfrom? Приложение ждет данных из сети , но если.

    Как принудительно завершить консольную программу ?
    return EXIT_SUCCESS; не канает, почему ? Он находится в функции которая при несовпадении данных.

    Эксперт .NET

    6451 / 3980 / 1587
    Регистрация: 09.05.2015
    Сообщений: 9,335

    Лучший ответ

    Сообщение было отмечено koker007 как решение

    Прервать цикл forEach (javascript)

    Есть массив со значениями. Внутри цикла есть условие поиска значения массива. Задача: остановить дальнейший перебор цикла при первом найденном значении. Спасибо за помощь. Решение: (спасибо Lieutenant Jim Dangle)

    [1, 2, 3, 4, 3].some(function(el,i) < if (el == 3) < console.log(i); return el; >>); 

    Отслеживать
    Менеджер Типографии
    задан 6 янв 2017 в 12:28
    Менеджер Типографии Менеджер Типографии
    587 2 2 золотых знака 5 5 серебряных знаков 18 18 бронзовых знаков
    @LieutenantJimDangle, твой код так же не работает как и код в вопросе 🙂
    6 янв 2017 в 12:40
    @LieutenantJimDangle, это просто убирает синтаксическую ошибку
    6 янв 2017 в 12:43
    Добавь в вопрос пример твоего массива, и что именно в нем ты хочешь найти и вывести.
    6 янв 2017 в 12:59

    Код решения неверен. результат возвращаемый функцией Callback переданной в some нужен только для проверки останавливать ли проход по коллекции или нет. Поэтому если вдруг искомый элемент будет 0 - то в твоем случае some пройдет по всей коллекции

    6 янв 2017 в 13:09

    4 ответа 4

    Сортировка: Сброс на вариант по умолчанию

    метод forEach не предусматривает возможности прервать обход коллекции.

    Если нужно проверить наличие конкретного элемента удовлетворяющего условию, лучше использовать метод some

    var massiv = ['2', '1', '3']; console.log(massiv.some(function(item) < console.log('some', item); return (item == "1"); >));

    Если проверяются полностью объекты, можно использовать метод indexOf

    var massiv = ['2', '1', '3']; console.log(massiv.indexOf("1"));

    Если нужно найти индекс элемента удовлетворяющего условию, то подойдет метод findIndex

    var massiv = ['2', '1', '3']; console.log(massiv.findIndex(function(item) < console.log('findIndex', item); return item == "1"; >));

    Если очень хочется использовать именно forEach - можно поместить его в try..catch и кидать ошибку если элемент найден.

    var massiv = ['2', '1', '3']; try < massiv.forEach(function(item, i) < console.log('foreach', i); if (item == "1") < throw < reason: "finded", index: i >> >); > catch (< reason, index >) < if (reason) < console.log(reason, ':', index) >>

    Вместо встроенных функций массива, можно также воспользоваться циклом for . В этом случае для прерывания цикла можно использовать выражение break

    Отслеживать
    ответ дан 6 янв 2017 в 12:48
    80.6k 9 9 золотых знаков 78 78 серебряных знаков 134 134 бронзовых знака

    Во всех варианта у Вас именно поиск конкретного элемента. А задача была найти первый найденный. В Вашей интерпритации массива было бы так: var massiv = ['2', '1', '3', '1']; И нужно найти индекс первой найденной еденички (то есть результатом остановки было бы значение 1 (второй элемент массива)

    6 янв 2017 в 12:54

    @МенеджерТипографии, все методы some , findIndex - прекращают выполнение, как только callback вернет true . Метод indexOf , находит первое вхождение элемента. начиная с указанного индекса, так как индекс не указан, проверка начинается с первого элемента массива.

    6 янв 2017 в 12:56

    @МенеджерТипографии, если задача заключается просто в проверке наличия элементов в массиве. то foreach вообще не нужен. В противном случае, все методы делают то же самое что и код в вопросе, за исключением прекращения выполнения когда условие выполнилось

    6 янв 2017 в 12:58

    В методе forEach не предусмотренa остановка как в лупе посредством брейк.

    Использовать every заместо forEach . Когда будет false , все остановится.

    Это самый правильный способ.

    massiv.every(function(item, i) < if (item == "1") < console.log(i); return false; >else < return true; >>); 

    Отслеживать
    80.6k 9 9 золотых знаков 78 78 серебряных знаков 134 134 бронзовых знака
    ответ дан 6 янв 2017 в 12:32
    3,416 1 1 золотой знак 9 9 серебряных знаков 18 18 бронзовых знаков
    на счет Это самый правильный способ - можно поспорить
    6 янв 2017 в 13:04

    я привел пример точно на поставленый вопрос, это делает то, что надо @Менеджер Типографии, все остальные ответы, по моему мнению не еффктивны. есть четко поставленый вопрос, и есть решение.

    6 янв 2017 в 13:23

    some - делает абсолютно то же самое. разница только в знаке сравнения. И все это менее эффективно чем обычный for за счет постоянного вызова функции-коллбэка. Кроме того, неизвестно что вообще нужно автору, что именно он хочет делать с полученным элементом. нужен ли ему элемент или индекс элемента и т.д.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *