В чем разница между IEnumerator и IEnumerable?[дубликат]
-
03-07-2019 - |
Вопрос
Возможный Дубликат:
Кто-нибудь может объяснить мне IEnumerable и IEnumerator?
В чем разница между IEnumerator и IEnumerable?
Решение
IEnumerable ( количество ) это интерфейс, который определяет один метод GetEnumerator (получить нумератор) который возвращает IEnumerator ( нумератор ) интерфейс, это, в свою очередь, обеспечивает доступ к коллекции только для чтения.Коллекция, реализующая IEnumerable, может использоваться с оператором foreach .
Определение
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
Другие советы
IEnumerator
- это вещь, которая может перечислять: у нее есть свойство Current
и методы MoveNext
и Reset
(которые в коде .NET вы, вероятно, не будете вызывать явно, хотя могли бы). р>
IEnumerable
- это вещь, которую можно перечислить ... это просто означает, что у нее есть метод GetEnumerator, который возвращает IEnumerator<T>
.
Что вы используете? Единственная причина использовать Enumerator<T>
- это если у вас есть нестандартный способ перечисления (то есть, возвращать его различные элементы один за другим), и вам нужно определить, как это работает. Вы бы создали новый класс, реализующий List<T>
. Но вам все равно нужно вернуть это Queue<T>,
в Stack<T>
классе.
Чтобы узнать, как выглядит перечислитель (реализующий <=>), посмотрите любой класс <=>, например, в <=>, <=> или <=>. Посмотрите на класс, реализующий <=>, см. Любой стандартный класс коллекции.
Enumerator
показывает вам элементы в списке или коллекции.
Каждый экземпляр перечислителя находится в определенной позиции (1-й элемент, 7-й элемент и т. Д.) И может предоставить вам этот элемент (IEnumerator.Current
) или перейти к следующему (IEnumerator.MoveNext
). Когда вы пишете цикл foreach
в C #, компилятор генерирует код, который использует Enumerator.
Enumerable
- это класс, который может дать вам GetEnumerator
. У него есть метод <=>, который дает вам <=>, который просматривает его элементы. Когда вы пишете цикл <=> в C #, генерируемый им код вызывает <=> для создания <=> цикла.
IEnumerable и IEnumerator оба являются интерфейсами. IEnumerable имеет только один метод с именем GetEnumerator. Этот метод возвращает (так как все методы возвращают что-то, включая void) другой тип, который является интерфейсом, а этот интерфейс - IEnumerator. Когда вы реализуете логику перечислителя в любом классе вашей коллекции, вы реализуете IEnumerable (либо универсальный, либо не универсальный). IEnumerable имеет только один метод, тогда как IEnumerator имеет 2 метода (MoveNext и Reset) и свойство Current. Для простоты понимания рассмотрим IEnumebale блок, в котором находится IEnumerator (но не через наследование или ограничение). Смотрите код для лучшего понимания:
class Test : IEnumerable, IEnumerator
{
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public object Current
{
get { throw new NotImplementedException(); }
}
public bool MoveNext()
{
throw new NotImplementedException();
}
public void Reset()
{
throw new NotImplementedException();
}
}