В C# IEnumerable<T> и IEnumerator являются интерфейсами, которые используются для перебора коллекций, но выполняют разные задачи.
IEnumerable<T>
IEnumerable<T> представляет коллекцию, которая может быть перечислена. Он определяет метод GetEnumerator(), который возвращает объект IEnumerator<T>.
Пример реализации:
public class MyCollection : IEnumerable<int>
{
private int[] items = { 1, 2, 3 };
public IEnumerator<int> GetEnumerator()
{
foreach (var item in items)
{
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}IEnumerator<T>
IEnumerator<T> представляет итератор, который позволяет перебирать элементы коллекции. Он определяет методы:
MoveNext()– переходит к следующему элементу,Current– возвращает текущий элемент,Reset()– сбрасывает итератор в начальное состояние.
Пример работы с IEnumerator<T>:
IEnumerator<int> enumerator = new MyCollection().GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}Отличия IEnumerable<T> и IEnumerator<T>
| Характеристика | IEnumerable<T> | IEnumerator<T> |
|---|---|---|
| Назначение | Представляет коллекцию | Управляет процессом итерации |
| Методы | GetEnumerator() | MoveNext(), Current, Reset() |
| Использование | Используется в foreach | Используется вручную |
IEnumerable<T> предоставляет интерфейс для коллекции, а IEnumerator<T> управляет процессом итерации. foreach автоматически использует эти интерфейсы для удобного перебора элементов.