Кто-либо может объяснить мне, каково различие между IEnumerable & IEnumerator, и как использовать их?
Спасибо!!!
Вообще, IEnumerable
- это объект, который можно перечислить, например, список или массив. IEnumerator
- это объект, который хранит состояние перечисления.
Причина, по которой они не являются одним и тем же, заключается в том, что вы можете иметь несколько перечислений над одним и тем же объектом в одно и то же время - даже в однопоточном приложении. Например, рассмотрим следующий код:
foreach (x in mylist)
{
foreach (y in mylist)
{
if (x.Value == y.Value && x != y)
{
// Found a duplicate value
}
}
}
Это будет работать нормально, если mylist
является правильной реализацией IEnumerable
, но потерпит неудачу, если mylist
вернет себя в качестве перечислителя.
IEnumerable
определяет объект, который содержит совокупность объектов, которые можно перечислить.
IEnumerator
- это объект, который позволяет перечислять агрегаты и сохраняет состояние перечисления.
IEnumerable означает то, что можно перечислить, IEnumerator - это то, что перечисляет.
Упрощение до простого цикла for:
for (int i=0; i<10;i++)
{
count+=myarray[i];
}
В приведенном выше примере я был бы IEnumerator, а myarray - IEnumerable.
IEnumerable
- это то, что можно перечислить. IEnumerator
- это средство для выполнения этого перечисления. Итак, IEnumerable
определяет только один метод - GetEnumerator
, который возвращает экземпляр IEnumerator
для выполнения фактической беговой работы ...
Интерфейс IEnumerable
определяет класс, который можно перечислить, т.е. он содержит элементы, к которым можно получить доступ через перечисление.
Интерфейсы IEnumerator
определяют класс, который может выполнять перечисление по последовательности элементов.
Различие в том, что IEnumerable
означает «вы можете перечислить меня», где IEnumerator
выполняет задачу перечисления.
Чтобы уточнить детали, IEnumerable
предоставляет метод GetEnumerator
. Этот метод возвращает IEnumerator
, который затем можно использовать для выполнения перечисления. Обычно вы сами не имеете дело с этим методом, потому что ключевое слово foreach
обрабатывает его за вас.
foreach(int element in myList)
{
// Do some work...
}
Этот код фактически расширен для вас компилятором до следующего:
IEnumerator enumerator = myList.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int element = (int)enumerator.Current;
// Do some work...
}
}
finally
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
Как видите, IEnumerator
используется здесь для выполнения перечисления по элементам.