第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 C# 中實(shí)現(xiàn)自己的集合但需要修改 IEnumerable?

在 C# 中實(shí)現(xiàn)自己的集合但需要修改 IEnumerable?

C#
嚕嚕噠 2022-10-23 15:15:44
我發(fā)現(xiàn)一篇很棒的文章說明了 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;       }    }}我在這篇文章中發(fā)現(xiàn)了一些錯(cuò)誤,可能是一些拼寫錯(cuò)誤,例如_objects.Count應(yīng)該是_objects.Length ,但一個(gè)基本問題是:如何_objects在 ListEnumerator 中獲得訪問權(quán)限?所以我想我需要在區(qū)域 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     }   }...}為了做到這一點(diǎn), IEnumerable 也需要像interface IEnumerable {   IEnumerator GetEnumerator();   int Count{get;}   object this[int itemIndex]{set;get;}}但我們都知道IEnumerable只有一種方法GetEnumerator()需要實(shí)現(xiàn)。那么我們?cè)撊绾巫龅竭@一點(diǎn),任何人都可以修改代碼以使其工作嗎?
查看完整描述

1 回答

?
繁花如伊

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊

您所引用的文章的代碼有問題。


_objects是類的私有成員,List因此不能在類外部訪問它,即使是從List.


即使您_objects公開,如果不創(chuàng)建類對(duì)象也無法訪問它List。


也沒有辦法IEnumerable修改界面。


我建議遵循兩種方法。


方法一


更改ListEnumerator類構(gòu)造函數(shù)以接受List類的對(duì)象


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 構(gòu)造函數(shù)。_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類構(gòu)造函數(shù)以接受對(duì)象數(shù)組。


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


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 1 回答
  • 0 關(guān)注
  • 126 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)