IEnumerable & IEnumerator - PullRequest
       24

IEnumerable & IEnumerator

6 голосов
/ 14 апреля 2010

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

Спасибо !!!

Ответы [ 6 ]

11 голосов
/ 14 апреля 2010

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

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

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

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

10 голосов
/ 14 апреля 2010

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

3 голосов
/ 14 апреля 2010

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

2 голосов
/ 14 апреля 2010

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

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

0 голосов
/ 26 мая 2017

Разница между IEnumerable и IEnumerator.

  1. IEnumerable внутренне использует IEnumerator.
  2. IEnumerable не знает, какой элемент / объект выполняется.
  3. IEnumerator знает текущую позицию элемента / объекта.
  4. IEnumerable не знает текущую позицию элемента / объекта
  5. IEnumerable имеет один метод, GetEnumerator ()

Получить код - IEnumerable & IEnumerator

public class Program {  
    public static void Main(string[] args) {  
        IEnumerable_Example();  
    }  
    static void IEnumerable_Example() {  
        List < string > Month = new List < string > ();  
        Month.Add("January");  
        Month.Add("February");  
        Month.Add("March");  
        Month.Add("April");  
        Month.Add("May");  
        Month.Add("June");  
        Month.Add("July");  
        Month.Add("August");  
        Month.Add("September");  
        Month.Add("October");  
        Month.Add("November");  
        Month.Add("December");  
        IEnumerable < string > IEnumerable_ = (IEnumerable < string > ) Month;  
        Console.WriteLine("IEnumerable_Example() Executing");  
        Console.WriteLine("------------IEnumerable Returning items using foreach----------------");  
        foreach(string i in IEnumerable_) {  
            Console.WriteLine(i);  
        }  
        IEnumerator_Example(IEnumerable_);  
    }  
    static public void IEnumerator_Example(IEnumerable enumerable) {  
        IEnumerator enumerator = enumerable.GetEnumerator();  
        Console.WriteLine("----------IEnumerator_Example() Executing------------");  
        while (enumerator.MoveNext()) {  
            Console.WriteLine("----" + enumerator.Current.ToString() + "----");  
        }  
0 голосов
/ 14 апреля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...