Обычно я выполняю итерации, используя оператор управления, for
и поэтому легко получаю индекс итерации, но у меня возникает следующий вопрос: есть ли способ получить индекс итерации в foreach
en c#
?
так как я обычно получаю это так:
int i=0;
foreach (var item in array)
{
i++;
}
Другой вопрос: если есть способ получить индекс иначе, чем в примере, что это?
Если вы перебираете элементы, чтобы создать их новый список, вы можете использовать метод расширения
Select
( документация ), который имеет перегрузку индекса.Я думаю, что правильный способ получить индекс в a
foreach
- это тот, который вы используете, потому что это простой и оптимальный код, и иногда его может быть интересно использовать.Примером этого является класс ConcurrentBag .
В этом случае нет смысла использовать последовательность
for
, потому что, помимо прочего, элементы могут быть добавлены/удалены из другого потока выполнения во время обхода списка.Наконец, то, что вы никогда не должны делать, это использовать
Array.IndexOf
для получения индекса, потому что вы собираетесь принудительно искать в списке для каждой итерации.В дополнение к тому, что все написали, хочу написать немного теории.
for
: это цикл, который повторяется внутривсегонабора элементов, либо списка, либоArray
(общий пример) :На каждой из своих итераций он найдет значение элемента
i
вArray
, что приведет к следующему результату:Как видите, да, каждый элемент внутри
Array
.При
foreach
этом его можно перевести как:Что даст тот же результат, теперь мы говорим о
Array
массиве — это просто набор конечных элементов, если мы нацелимся на aList<T>
, все изменится:В классе, основной зависимостью которого является итератор, почему бы не использовать
foreach
для доступа к каждому элементуList<T>
? Если говорить о производительности, то мы ни при чем, классList
подготовлен к "пожару" в .NET Framework и циклеforeach
тоже, если нет, тестируйте скорость в каждом. (Еще один общий пример) :(Запустите предыдущий пример несколько раз, чтобы проверить полученные результаты)
Теперь, если вы хотите получить индекс элемента в классе, который содержит итераторы или поддерживает
index
, лучше всего использовать его индексатор или вызывать соответствующую функциюIndexOf
(как упоминают Асьер Вильянуэва и rsciriano )IndexOf
: это функция, которая возвращает целое число с текущей позицией элемента в вашем списке, стоит упомянуть, что эта функция доступна только для коллекций, которые находятся в пространстве именSystem.Collections.Generic
, она выглядит примерно так:Это практически то же самое, что итерировать список или коллекцию самостоятельно, чтобы получить индекс текущего элемента, практическое использование этой функции происходит, когда вам нужно получить конкретный элемент, общий пример :
И мне нужно специально получить мое имя, если оно существует:
Значение
IndexDeOp
равно3
, поэтому, если вам не нужно перебирать список, это лучший вариант.В качестве последнего упоминания цикл
foreach
можно использовать тольков классах или «коллекциях», которые реализуютIEnumerable[<T>]
, но это не совсем обязательно, достаточно реализации следующих функций и свойств:GetEnumerator
,Current
иMoveNext
.Вот несколько справочных ссылок:
for
,foreach
, скрипка .Вы можете получить индекс через метод IndexOf класса Array:
Но самое логичное, что если вам нужен индекс, вы используете for.
Я бы использовал другой тип цикла, так как с Foreach вам нужно добавить счетчик. Вы по-прежнему можете использовать Foreach и отдельный счетчик.
я бы использовал цикл while
Правильным было бы использовать for следующим образом:
Blucle
foreach
используется в итерациях, в которых нужно получать или работать не с индексом, а с объектами, для работы с индексом используется циклfor