[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
Для получения индекса текущей итерации цикла foreach, можно воспользоваться несколькими вариантами, рассмотрим их.
Foreach предназначен для итерации над коллекциями, которые реализуют IEnumerable. Для этого нужно вызвать GetEnumerator для коллекции, который вернет Enumerator.
Перечислитель имеет метод и свойство:
- MoveNext()
- Current
Current возвращает объект, на котором в данный момент находится Enumerator, MoveNext обновляет Current до следующего объекта.
Концепция индекса чужда концепции перечисления и не может быть выполнена.
Поэтому большинство коллекций можно обойти с помощью индексатора и конструкции цикла for.
Я предпочитаю использовать цикл for в этой ситуации, чем отслеживать индекс с помощью локальной переменной, как в этом примере:
1 2 3 4 5 6 7 8 9 10 |
static void Main() { int[] array = { 1, 2, 3, 5 }; int index = 0; foreach (int item in array) { Console.WriteLine($"Item - {item}, Index - {index++}"); } } |
Лучше использовать цикл for:
1 2 3 4 5 6 7 8 9 |
static void Main() { int[] array = { 1, 2, 3, 5 }; for (int i = 0; i < array.Length; i++) { Console.WriteLine($"Item - {array[i]}, Index - {i}"); } } |
Так же, в C#7 появился достойный синтаксис для получения индекса внутри цикла foreach (т.е. кортежей). Для этого примера потребуется определить собственный метод расширения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Programm { static void Main() { int[] array = { 1, 2, 3, 5 }; foreach (var (item, index) in array.WithIndex()) { Console.WriteLine($"Item - {item}, Index - {index}"); } } } public static class EnumExtension { public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> self) => self.Select((item, index) => (item, index)); } |