Использует ли foreach IEnumerator / IEnumerable для встроенных типов? - PullRequest
3 голосов
/ 29 сентября 2011

Использует ли цикл foreach интерфейсы IEnumerator и IEnumerable только для итерации объектов пользовательских типов (классов) или также для итерации встроенных типов (за кулисами)?

Ответы [ 4 ]

7 голосов
/ 29 сентября 2011

Foreach не зависит от IEnumerable как такового.Однако, если тип реализует его, тогда цикл foreach сможет его перечислить (сопоставление на основе шаблона).

За кулисами ему нужен только метод GetEnumerator(), а перечислитель должен содержать Current иMoveNext().

От MSDN:

  • Тип коллекции:

    • Должен быть одного из типов: interface , class или struct .
    • Должен включать метод экземпляра с именем GetEnumerator , который возвращает тип, например:Enumerator (поясняется ниже).
  • Тип Enumerator (класс или структура) должен содержать:

    • Свойство с именем Current , который возвращает ItemType или тип, который может быть преобразован в него.Метод доступа к свойству возвращает текущий элемент коллекции.
    • A bool метод с именем MoveNext , который увеличивает счетчик элементов и возвращает true если в коллекции больше предметов.

От MSDN - Использование foreach с коллекциями

ОБНОВЛЕНО: см. Обновленную страницу MSDN для этого - Как: получить доступ к классу коллекции с помощью foreach (Руководство по программированию в C #) .

2 голосов
/ 29 сентября 2011

Определить перечислитель, без IEnumerable объявления.!

public class WorkInfoEnumerator
{
  List<WorkItem > wilist= null;
  int currentIndex = -1;


  public MyClassEnumerator(List<WorkItem > list)
  {
     wilist= list;
  }

  public WorkItem Current
  {
     get
     {
         return wilist[currentIndex];
     }
  }

  public bool MoveNext()
  {
     ++currentIndex;
     if (currentIndex < wilist.Count)
         return true;
     return false;
  }   
}


public class WorkInfo
{
    List<WorkItem > mydata = new List<WorkItem >();
    public WorkInfoEnumerator GetEnumerator()
    {
        return new WorkInfoEnumerator(mydata);
    }
}

Где-то в коде можно использовать:

WorkInfo wi = new WorkInfo();
foreach(WorkItem witem in wi) 
{  
}
0 голосов
/ 29 сентября 2011

for-each является языковой конструкцией и на самом деле не делает различий между пользовательскими / встроенными типами.

для каждого не зависит от IEnumerable, оно использует сопоставление на основе шаблонов.Смотри http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx

0 голосов
/ 29 сентября 2011

foreach использует IEnumerable как для собственных, так и для пользовательских типов. Если вы посмотрите на System.Array, например, который является основой для всех типов массивов, он реализует IEnumerable.

...