2014-09-22 3 views
20

Отказ от ответственности: Я понимаю разницу между IEnumerable<T> и IEnumerator<T> и как использовать оба варианта. Это не дубликат this или this.Почему IEnumerable <T> необходим, когда есть IEnumerator <T>?

Это больше дизайнерского вопрос - так IEnumerator<T> уже инкапсулирует всю необходимую информацию (.Current, .MoveNext()) о чем-то, что может быть перечисленное, то в чем смысл введения типа (IEnumerable<T>), чья единственная цель состоит в том, чтобы возвращать экземпляр первого?

Конкретно:

  1. Почему не foreach могут быть разработаны, чтобы перебирать непосредственно через IEnumerator<T>, например, так:

    // foreach (var e in anEnumerator) { //... } 
    while (anEnumerator.MoveNext()) 
    { 
        doSomething(anEnumerator.Current); 
    } 
    
  2. Почему не может Linq быть построен на основе непосредственно от от IEnumerator<T>?

+1

Это, конечно, * возможно, было, но, не разговаривая с командой разработчиков .NET, я сомневаюсь, что вы получите здесь большой ответ. – BradleyDotNET

+2

Предположительно, будут другие ситуации (помимо циклов foreach), где необходим интерфейс, который обещает «способный обеспечить перечислитель». –

+1

@BradleyDotNET Это было спроектировано так, как будто это не значит, что нет причины. Для всех полезно узнать что-то, что потенциально имеет причину, я НЕ согласен, что это должно быть закрыто. – KFL

ответ

55

Эти два интерфейса представляют собой разные концепции. IEnumerable<T> - это то, что «позволяет перечисление», где IEnumerator<T> является представлением самого перечисления.

Если вы должны были объединить их вместе, невозможно было бы перечислить одну коллекцию несколько раз в одно и то же время (без какого-либо другого механизма на месте). Например, два потока, делающие foreach по массиву, больше не будут работать, если это вполне приемлемо в текущем проекте.

+9

+1. Вам даже не нужно включать потоки: вложенные перечисления в одной коллекции также не будут работать. – Blorgbeard

+1

@Blorgbeard Да - просто использовалась резьба в качестве примера. –

+1

Концептуально два понятия - оба понятия. – paqogomez

 Смежные вопросы

  • Нет связанных вопросов^_^