IEnumerable & IEnumerator

Кто-либо может объяснить мне, каково различие между IEnumerable & IEnumerator, и как использовать их?

Спасибо!!!

6
задан David M 14 April 2010 в 08:13
поделиться

5 ответов

Вообще, IEnumerable - это объект, который можно перечислить, например, список или массив. IEnumerator - это объект, который хранит состояние перечисления.

Причина, по которой они не являются одним и тем же, заключается в том, что вы можете иметь несколько перечислений над одним и тем же объектом в одно и то же время - даже в однопоточном приложении. Например, рассмотрим следующий код:

foreach (x in mylist)
{
    foreach (y in mylist)
    {
        if (x.Value == y.Value && x != y)
        {
            // Found a duplicate value
        }
    }
}

Это будет работать нормально, если mylist является правильной реализацией IEnumerable, но потерпит неудачу, если mylist вернет себя в качестве перечислителя.

11
ответ дан 8 December 2019 в 04:08
поделиться

IEnumerable определяет объект, который содержит совокупность объектов, которые можно перечислить.

IEnumerator - это объект, который позволяет перечислять агрегаты и сохраняет состояние перечисления.

2
ответ дан 8 December 2019 в 04:08
поделиться

IEnumerable означает то, что можно перечислить, IEnumerator - это то, что перечисляет.

Упрощение до простого цикла for:

for (int i=0; i<10;i++)
{
   count+=myarray[i];
}

В приведенном выше примере я был бы IEnumerator, а myarray - IEnumerable.

0
ответ дан 8 December 2019 в 04:08
поделиться

IEnumerable - это то, что можно перечислить. IEnumerator - это средство для выполнения этого перечисления. Итак, IEnumerable определяет только один метод - GetEnumerator , который возвращает экземпляр IEnumerator для выполнения фактической беговой работы ...

3
ответ дан 8 December 2019 в 04:08
поделиться

Интерфейс 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 используется здесь для выполнения перечисления по элементам.

10
ответ дан 8 December 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: