为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# 中实现自己的集合但需要修改 IEnumerable?

在 C# 中实现自己的集合但需要修改 IEnumerable?

C#
噜噜哒 2022-10-23 15:15:44
我发现一篇很棒的文章说明了 IEnumerable 和 IEnumeratorhttps://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()需要实现。那么我们该如何做到这一点,任何人都可以修改代码以使其工作吗?
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

您所引用的文章的代码有问题。


_objects是类的私有成员,List因此不能在类外部访问它,即使是从List.


即使您_objects公开,如果不创建类对象也无法访问它List。


也没有办法IEnumerable修改界面。


我建议遵循两种方法。


方法一


更改ListEnumerator类构造函数以接受List类的对象


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;

    }

}

您还需要从in classprivate的声明中删除。并传递给 ListEnumerator 构造函数。_objectsListthis


public class List : IEnumerable

{

    object[] _objects;


    public List()

    {

        _objects = new object[100];

    }

    //Other code of List class.


    public IEnumerator GetEnumerator()

    {

       return new ListEnumerator(this);

    }

}

方法二


更改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);


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信