1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一文看懂IEnumerator和IEnumerable接口的區(qū)別!

        共 2252字,需瀏覽 5分鐘

         ·

        2021-01-19 02:46


        IEnumerator、IEnumerable這兩個接口單詞相近、含義相關(guān),傻傻分不清楚。
        入行多年,一直沒有系統(tǒng)性梳理這對李逵李鬼。

        最近本人在懟著why神的《其實吧,LRU也就那么回事》,方案1使用數(shù)組實現(xiàn)LRU,手寫算法涉及這一對接口,借此時機覆蓋這一對難纏的冤家。

        IEnumerator

        IEnumerator、IEnumerable接口有相似的名稱,這兩個接口通常也在一起使用,它們有不同的用途。

        IEnumerator接口為類內(nèi)部的集合提供了迭代方式, IEnumerator 要求你實現(xiàn)三個方法:

        • MoveNext方法:該方法將集合索引加1,并返回一個bool值,指示是否已到達集合的末尾。
        • Reset方法:它將集合索引重置為其初始值-1,這會使枚舉數(shù)無效。
        • Current方法: 返回position位置的當(dāng)前對象

        IEnumerable

        IEnumerable接口為foreach迭代提供了支持,IEnumerable要求你實現(xiàn)GetEnumerator方法。

        public?IEnumerator?GetEnumerator()
        {
        ????return?(IEnumerator)this;
        }

        該用哪一個接口?

        僅憑以上辭藻,很難區(qū)分兩個接口的使用場景。

        IEnumerator接口定義對類中的集合類型對象的迭代方式,

        IEnumerable接口允許使用foreach循環(huán)進行枚舉。

        因此IEnumerable接口的GetEnumerator方法會返回一個IEnumerator接口。要實現(xiàn)IEnumerable,你還必須實現(xiàn)IEnumerator。

        從英文詞根上講:
        IEnumerator接口代表了枚舉器,里面定義了枚舉方式,是名詞。
        IEnumerable接口代表該對象具備了可被枚舉的性質(zhì),是形容詞。

        總之,如果您想提供對foreach的支持,那么就先讓對象可枚舉,再談?wù)撁杜e方式,也就是說實現(xiàn)這兩個接口。

        最佳實踐

        • 在嵌套類中實現(xiàn)IEnumerator,這樣你可以創(chuàng)建多個枚舉器。
        • 為IEnumerator的Current方法提供異常處理。
          為什么要這么做?
          如果集合的內(nèi)容發(fā)生變化,則
          reset方法將被調(diào)用,緊接著當(dāng)前枚舉數(shù)無效,您將收到一個IndexOutOfRangeException異常(其他情況也可能導(dǎo)致此異常)。所以執(zhí)行一個Try…Catch塊來捕獲這個異常并引發(fā)InvalidOperationException異常, 提示在迭代時不允許修改集合內(nèi)容。

        這也正是我們常見的在foreach 里面嘗試修改迭代對象會報InvalidOperationException異常的原因。

        下面以汽車列表為例實現(xiàn)IEnumerator IEnumerable接口

        using?System;
        using?System.Collections;
        namespace?ConsoleEnum
        {
        ????public?class?cars?:?IEnumerable
        ????{
        ????????private?car[]?carlist;
        ??
        ????????//Create?internal?array?in?constructor.
        ????????public?cars()
        ????????{
        ????????????carlist=?new?car[6]
        ????????????{
        ????????????????new?car("Ford",1992),
        ????????????????new?car("Fiat",1988),
        ????????????????new?car("Buick",1932),
        ????????????????new?car("Ford",1932),
        ????????????????new?car("Dodge",1999),
        ????????????????new?car("Honda",1977)
        ????????????};
        ????????}
        ????????//private?enumerator?class
        ????????private?class??MyEnumerator:IEnumerator
        ????????{
        ????????????public?car[]?carlist;
        ????????????int?position?=?-1;

        ????????????//constructor
        ????????????public?MyEnumerator(car[]?list)
        ????????????{
        ????????????????carlist=list;
        ????????????}
        ????????????private?IEnumerator?getEnumerator()
        ????????????{
        ????????????????return?(IEnumerator)this;
        ????????????}
        ????????????//IEnumerator
        ????????????public?bool?MoveNext()
        ????????????{
        ????????????????position++;
        ????????????????return?(position?????????????}
        ????????????//IEnumerator
        ????????????public?void?Reset()
        ????????????{
        ????????????????position?=?-1;
        ????????????}
        ????????????//IEnumerator
        ????????????public?object?Current
        ????????????{
        ????????????????get
        ????????????????{
        ????????????????????try
        ????????????????????{
        ????????????????????????return?carlist[position];
        ????????????????????}
        ????????????????????catch?(IndexOutOfRangeException)
        ????????????????????{
        ????????????????????????throw?new?InvalidOperationException();
        ????????????????????}
        ????????????????}
        ????????????}
        ????????}??//end?nested?class
        ??????public?IEnumerator?GetEnumerator()
        ??????{
        ??????????return?new?MyEnumerator(carlist);
        ??????}
        ????}
        }
        回復(fù)?【關(guān)閉】學(xué)關(guān)
        回復(fù)?【實戰(zhàn)】獲取20套實戰(zhàn)源碼
        回復(fù)?【被刪】學(xué)
        回復(fù)?【訪客】學(xué)
        回復(fù)?【小程序】學(xué)獲取15套【入門+實戰(zhàn)+賺錢】小程序源碼
        回復(fù)?【python】學(xué)微獲取全套0基礎(chǔ)Python知識手冊
        回復(fù)?【2019】獲取2019 .NET 開發(fā)者峰會資料PPT
        回復(fù)?【加群】加入dotnet微信交流群

        再見,VIP,臥槽又來一個看片神器!


        副業(yè)剛需,個人開發(fā)者如何通過小程序變現(xiàn)?已經(jīng)有朋友變現(xiàn)月入4k了!


        瀏覽 41
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩特黄特色免费视频 | 亚洲爽爽色 | 成人爽a毛片免费视频在线看 | 操逼逼片 | 天天撸天天操天天干 | 美女操软件 | 我被继夫添我阳道舒服口述视频 | 美女免费高清视频黄是免费 | 无码毛片一区二区三区人口 | eeuss鲁片一区二区三区小说 |