Я нашел отличную статью, иллюстрирующую IEnumerable, а IEnumerator
https://programmingwithmosh.com/csharp/ienumerable-and-ienumerator/
ниже приведен исходный код:
public class List : IEnumerable
{
private object[] _objects;
public List()
{
_objects = new object[100];
}
public void Add(object obj)
{
_objects[_objects.Count] = obj;
}
public IEnumerator GetEnumerator()
{
return new ListEnumerator(); //region 1
}
private class ListEnumerator : IEnumerator
{
private int _currentIndex = -1;
public bool MoveNext()
{
_currentIndex++;
return (_currentIndex < _objects.Count);
}
public object Current
{
...
}
public void Reset()
{
_currentIndex = -1;
}
}
}
Я нашел несколько ошибок в этой статье,вероятно, некоторые опечатки, такие как _objects.Count
, должны быть _objects.Length
, но есть одна фундаментальная проблема: как получить доступ к _objects
в ListEnumerator?Поэтому я предполагаю, что мне нужно передать 'this' в область 1
public IEnumerator GetEnumerator()
{
return new ListEnumerator(this);
}
и изменить ListEnumerator следующим образом:
private class ListEnumerator : IEnumerator
{
private int _currentIndex = -1;
IEnumerable aggregate = null;
public ListEnumerator(IEnumerable param)
{
aggregate = param
}
public bool MoveNext()
{
_currentIndex++;
return (_currentIndex < aggregate.Count); //important region
}
public object Current
{
//don't worry about the boundary check/exceptions
get
{
return aggregate[_currentIndex]; //important region
}
}
...
}
Для того, чтобы сделать это, IEnumerable также должен быть похож на
interface IEnumerable
{
IEnumerator GetEnumerator();
int Count{get;}
object this[int itemIndex]{set;get;}
}
, но мы все знаем, что IEnumerable
имеет только один метод GetEnumerator()
, который необходимо реализовать.Итак, как мы можем это сделать, кто-нибудь может изменить код, чтобы он работал?