C# IEnumerator IEnumerable接口

前言

使用linq的時候大家應(yīng)該都知道IEnumerable和IEnumerator接口!

解釋一下

  • IEnumerable 它利用 GetEnumerator() 返回 IEnumerator 集合訪問器,聲明實現(xiàn)該接口的class是“可枚舉(enumerable)”的 通俗點說就是可進行迭代操作的類型瞎颗。

  • IEnumerator解釋:它是一個的集合訪問器旺入,使用foreach語句遍歷集合或數(shù)組時门怪,就是調(diào)用 Current坐梯、MoveNext()的結(jié)果郎汪。

例子

今天給大家講講迭代器的原理 我們自己實現(xiàn)一個UserInforMationList

我這里定義一個UserInforMationModel和UserInforMationList類

public class UserInforMationList
    {
        public UserInforMation[] _UserInforMations;
        public void Add(UserInforMation[] userInforMations)
        {
            _UserInforMations = new UserInforMation[userInforMations.Length];
            for (int i = 0; i < userInforMations.Length; i++)
            {
                _UserInforMations[i] = userInforMations[i];
            }
        }
    }
    {
        public string UserName { get; set; }
        public string Sex { get; set; }
    }

使用我們的測試方法价卤,發(fā)現(xiàn)我們的代碼報錯了UserInforMationList不包含 GetEnumerator的公共實例劝萤,因此不能使用ForEach.

那么我們要怎么實現(xiàn)Foreach了那就要用到IEnumerator、IEnumerable!

提示告訴我們?nèi)鄙僖粋€GetEnumerator的公共實例

我們看下IEnumerable接口

    {
        [DispId(-4)]
        [__DynamicallyInvokable]
        IEnumerator GetEnumerator();
    }

Enumerable接口剛好返回一個GetEnumerator 然后再看一下IEnumerator

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

    {
        [__DynamicallyInvokable]
        object Current
        {
            [__DynamicallyInvokable]
            get;
        }

        [__DynamicallyInvokable]
        bool MoveNext();

        [__DynamicallyInvokable]
        void Reset();
    }

看了這兩個接口就可以知道我們的UserInforMationList:要繼承這個IEnumerable接口 這個接口返回的是一個GetEnumerator床嫌。觀察這方法,

        {
            throw new NotImplementedException();
        }

需要返回一個叫做IEnumerator的接口胸私,因此厌处,一個類要想可迭代,還需要進一步實現(xiàn)IEnumerator類岁疼,這個才是真正獲取到的迭代器阔涉,

那我們再定義一個UserInforMationEnumerator繼承于GetEnumerator然后實現(xiàn)這三個方法,

  • MoveNext方法:該方法將集合索引加1,并返回一個bool值瑰排,指示是否已到達集合的末尾贯要。
  • Reset方法:它將集合索引重置為其初始值-1,這會使枚舉數(shù)無效椭住。
  • Current方法: 返回position位置的當(dāng)前對象
    {
        public UserInforMation[] _userInforMations;
        public int _Index = -1;
        public UserInforMationEnumerator(UserInforMation[] userInforMations)
        {
            _userInforMations = userInforMations;
        }
        public object Current => _userInforMations[_Index];

        public bool MoveNext()
        {
            _Index++;
            return _Index < _userInforMations.Length;
        }

        public void Reset()
        {
            _Index = -1;
        }
    }

這樣我們就實現(xiàn)了自己的迭代器崇渗。

然后我們跑一下代碼

我們調(diào)用GetEnumerator的時候,看似里面for循環(huán)了一次京郑,其實這個時候沒有做任何操作宅广。只有調(diào)用MoveNext的時候才會對應(yīng)調(diào)用for循環(huán):

現(xiàn)在我想可以回答你為什么Linq to Object中要返回IEnumerable?:

因為IEnumerable是延遲加載的,每次訪問的時候才取值傻挂。也就是我們在Lambda里面寫的where乘碑、select并沒有循環(huán)遍歷(只是在組裝條件),只有在ToList或foreache的時候才真正去集合取值了金拒。這樣大大提高了性能兽肤。

最后大家如果喜歡我的文章,還麻煩給個關(guān)注并點個贊, 希望net生態(tài)圈越來越好绪抛!

微信公眾號:黑哥聊dotNet

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末资铡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幢码,更是在濱河造成了極大的恐慌笤休,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件症副,死亡現(xiàn)場離奇詭異店雅,居然都是意外死亡,警方通過查閱死者的電腦和手機贞铣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門闹啦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辕坝,你說我怎么就攤上這事窍奋。” “怎么了酱畅?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵琳袄,是天一觀的道長。 經(jīng)常有香客問我纺酸,道長窖逗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任餐蔬,我火速辦了婚禮碎紊,結(jié)果婚禮上在张,老公的妹妹穿的比我還像新娘。我一直安慰自己矮慕,他們只是感情好帮匾,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痴鳄,像睡著了一般瘟斜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痪寻,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天螺句,我揣著相機與錄音,去河邊找鬼橡类。 笑死蛇尚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顾画。 我是一名探鬼主播取劫,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼研侣!你這毒婦竟也來了谱邪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤庶诡,失蹤者是張志新(化名)和其女友劉穎惦银,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體末誓,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡扯俱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喇澡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迅栅。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撩幽,靈堂內(nèi)的尸體忽然破棺而出库继,到底是詐尸還是另有隱情箩艺,我是刑警寧澤窜醉,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站艺谆,受9級特大地震影響榨惰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜静汤,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一琅催、第九天 我趴在偏房一處隱蔽的房頂上張望居凶。 院中可真熱鬧,春花似錦藤抡、人聲如沸侠碧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弄兜。三九已至,卻和暖如春瓷式,著一層夾襖步出監(jiān)牢的瞬間替饿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工贸典, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留视卢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓廊驼,卻偏偏與公主長得像据过,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妒挎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容