Я довольно давно пытался понять идею IEnumerable
и IEnumerator
. Я прочитал все вопросы и ответы, которые смог найти в сети, и в частности на StackOverflow, но меня это не удовлетворило. Я дошел до того, что понимаю как эти интерфейсы, но не понимаю, почему они используются таким образом.
Думаю, что суть моего недоразумения в том, что нам нужно два интерфейса для одной операции. Я понял, что если нужны оба, то одного, вероятно, недостаточно. Поэтому я взял "жестко закодированный" эквивалент foreach
(как я нашел здесь):
while (enumerator.MoveNext())
{
object item = enumerator.Current;
// logic
}
и пытался заставить его работать с одним интерфейсом, думая, что что-то пойдет не так, что дало бы мне понять, зачем нужен другой интерфейс.
Итак, я создал класс коллекции и реализовал IForeachable
:
class Collection : IForeachable
{
private int[] array = { 1, 2, 3, 4, 5 };
private int index = -1;
public int Current => array[index];
public bool MoveNext()
{
if (index < array.Length - 1)
{
index++;
return true;
}
index = -1;
return false;
}
}
и использовал эквивалент foreach
для номинации коллекции:
var collection = new Collection();
while (collection.MoveNext())
{
object item = collection.Current;
Console.WriteLine(item);
}
И это работает! Так чего же здесь не хватает, чтобы потребовать другого интерфейса?
Спасибо.
Изменить: Мой вопрос не дублирует вопросы, перечисленные в комментариях:
- Этот вопрос заключается в том, почему интерфейсы необходимы для перечисления в первое место.
- Этот вопрос и этот вопрос касается что это интерфейсы и как < / em> следует ли их использовать.
У меня вопрос: почему они спроектированы именно так, а не что из них, как они работают и зачем они нам нужны в первое место.
IEnumerator<T>
- person Dmitry Bychenko   schedule 31.03.2017while
для некоторого условия и выполните еще один цикл снова, и вы будете просветлены. - person Mat J   schedule 31.03.2017