Как мне выйти из цикла 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
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; не канает, почему ? Он находится в функции которая при несовпадении данных.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 за счет постоянного вызова функции-коллбэка. Кроме того, неизвестно что вообще нужно автору, что именно он хочет делать с полученным элементом. нужен ли ему элемент или индекс элемента и т.д.