[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на 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)); } |