亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 121 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號