我发现了一篇很棒的文章来说明IEnumerable和IEnumerator
https://programmingwithmosh.com/csharp/ienumerable-and-ienumerator/
以下是源代码:
公共类列表:IEnumerable{ …
您所指的文章代码存在问题。
_objects 是班级的私人成员 List 所以它不能在课外访问,即使是从类的 List 。
_objects
List
即使你做 _objects public,如果没有创建对象就无法访问它 List 类。
也没有办法 IEnumerable 界面可以修改。
IEnumerable
我建议采用两种方法。
的 方法1 强>
更改 ListEnumerator 类构造函数接受一个对象 List 类
ListEnumerator
private class ListEnumerator : IEnumerator { private List _list; public ListEnumerator(List list) { this._list = list; } private int _currentIndex = -1; public bool MoveNext() { _currentIndex++; return (_currentIndex < this._list._objects.Length); } public object Current { get { try { return this._list._objects[_currentIndex]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } public void Reset() { _currentIndex = -1; } }
你还需要删除 private 来自宣言 _objects 在 List 类。 通过 this 到ListEnumerator构造函数。
private
this
public class List : IEnumerable { object[] _objects; public List() { _objects = new object[100]; } //Other code of List class. public IEnumerator GetEnumerator() { return new ListEnumerator(this); } }
的 方法2 强>
更改 ListEnumerator 类构造函数接受一个对象数组。
private class ListEnumerator : IEnumerator { private object[] _objects; public ListEnumerator(object[] objects) { this._objects = objects; } private int _currentIndex = -1; public bool MoveNext() { _currentIndex++; return (_currentIndex < this._objects.Length); } public object Current { get { try { return this._objects[_currentIndex]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } public void Reset() { _currentIndex = -1; } }
并在List类中使用它如下。
public IEnumerator GetEnumerator() { return new ListEnumerator(this._objects); }