Интерфейс IEnumerable
Интерфейс IEnumerable<T> объявляет
метод GetEnumerator, который возвращает
перечислитель IEnumerator<T>.
List<T>
реализует этот интерфейс, поэтому по списку
можно идти в foreach.
Синтаксис
IEnumerator<T> GetEnumerator();
Пример
Давайте обойдём список как IEnumerable:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> nums = new List<int> {1, 2, 3, 4, 5};
IEnumerable<int> seq = nums;
List<int> copy = new List<int>();
foreach (int x in seq)
{
copy.Add(x);
}
Console.WriteLine(string.Join(" ", copy));
}
}
Результат выполнения кода:
1 2 3 4 5
Пример
Давайте получим перечислитель вручную:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> nums = new List<int> {1, 2, 3, 4, 5};
IEnumerator<int> en = nums.GetEnumerator();
en.MoveNext();
Console.WriteLine(en.Current);
}
}
Результат выполнения кода:
1
Пример
Давайте обойдём строки:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> items = new List<string> {"a", "b", "c", "d", "e"};
IEnumerable<string> seq = items;
Console.WriteLine(seq.GetEnumerator().MoveNext());
}
}
Результат выполнения кода:
True
Пример
Давайте используем нетипизированный IEnumerable:
using System;
using System.Collections.Generic;
using System.Collections;
class Program
{
static void Main()
{
List<int> nums = new List<int> {1, 2, 3, 4, 5};
System.Collections.IEnumerable seq = nums;
int n = 0;
foreach (object o in seq) n++;
Console.WriteLine(n);
}
}
Результат выполнения кода:
5
Смотрите также
-
интерфейс
IEnumerator,
который выполняет шаги обхода -
интерфейс
ICollection,
который расширяет IEnumerable -
класс
List,
который реализует IEnumerable -
интерфейс
IReadOnlyCollection,
который тоже допускает перечисление