我发现一篇很棒的文章说明了 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 中获得访问权限?所以我想我需要在区域 1 中传递 'this'
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()需要实现。那么我们该如何做到这一点,任何人都可以修改代码以使其工作吗?
繁花如伊
相关分类