引言

          IEnumerable是可枚舉的所有非泛型集合的基接口,?
          IEnumerable包含一個方法GetEnumerator(),該方法返回一個IEnumerator;
          IEnumerator提供通過Current屬性以及MoveNext()和Reset()方法來循環(huán)訪問集合的功能。

          IEnumerable 接口

          公開枚舉數(shù),該枚舉數(shù)支持在非泛型集合上進(jìn)行簡單迭代。接口源碼如下:
          public interface IEnumerable { [DispId(-4), __DynamicallyInvokable]
          IEnumerator GetEnumerator(); }
          IEnumerator 接口

          支持對非泛型集合的簡單迭代。接口源碼如下:
          public interface IEnumerator { [__DynamicallyInvokable] bool MoveNext();
          [__DynamicallyInvokable]object Current { [__DynamicallyInvokable] get; }
          [__DynamicallyInvokable]void Reset(); }
          舉例說明

          示例演示了通過實現(xiàn)IEnumerable和IEnumerator接口來循環(huán)訪問自定義集合的最佳實踐。

          定義一個簡單的實體類:
          public class Person { public Person(string name, int age) { this.Name = name;
          this.Age = age; } public string Name; public int Age; }
          定義一個實體類的集合,繼承IEnumerate:
          public class People : IEnumerable { private Person[] _people; public
          People(Person[] pArray) { _people= new Person[pArray.Length]; for (int i = 0; i
          < pArray.Length; i++) { _people[i] = pArray[i]; } } /// <summary> ///
          GetEnumerator方法的實現(xiàn)/// </summary> /// <returns></returns> IEnumerator
          IEnumerable.GetEnumerator() {return GetEnumerator(); } public PeopleEnum
          GetEnumerator() {return new PeopleEnum(_people); } }
          定義一個枚舉器,繼承IEnumerator:
          public class PeopleEnum : IEnumerator { public Person[] _people; /// <summary>
          /// 枚舉器位于第一個元素之前直到第一個MoveNext()調(diào)用。 /// </summary> private int position = -1;
          public PeopleEnum(Person[] list) { _people = list; } public bool MoveNext() {
          position++; return position < _people.Length; } public void Reset() { position
          = -1; } object IEnumerator.Current => Current; public Person Current { get { try
          {return _people[position]; } catch (IndexOutOfRangeException) { throw new
          InvalidOperationException(); } } } }
          具體調(diào)用:
          Person[] peopleArray = new Person[3] { new Person("張三", 15), new Person("李四",
          18), new Person("王五", 21), }; People peopleList = new People(peopleArray);
          foreach (Person p in peopleList) Console.WriteLine(p.Name + "\t" + p.Age);
          輸出:



          其中,上邊調(diào)用中foreach等價于
          IEnumerator enumeratorSimple = peopleList.GetEnumerator(); while
          (enumeratorSimple.MoveNext()) { Person p= enumeratorSimple.Current as Person;
          Console.WriteLine(p?.Name + "\t" + p?.Age); }
          通過例子,可以得出:

          * 實現(xiàn)一個自定義集合,繼承于IEnumerate,必須實現(xiàn)一個枚舉器;
          * C# 語言的foreach語句隱藏了枚舉數(shù)的復(fù)雜性,因此, 建議foreach使用, 而不是直接操作枚舉器;
          * 枚舉器可用于讀取集合中的數(shù)據(jù),但不能用于修改基礎(chǔ)集合。
          總結(jié)


          IEnumerable代表繼承此接口的類(比如ArrayList,IList,List<T>等)可以獲取一個IEnumerator來實現(xiàn)枚舉這個類中包含的集合中的元素的功能,是
          .NET Framework
          中最基本的集合訪問器。在編程中,Lambda表達(dá)式通過Select()或者Where()返回的變量為IEnumerate<T>,此時我們可以通過foreach遍歷。
          希望本文對你有所幫助,下一篇介紹Lambda中的Select和Where,感興趣的朋友可以加關(guān)注,歡迎留言交流!

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                看片操逼 | 美女被爆操 | 国产亚洲精品成人a v久久网站 | 麻豆爱爱小视频 | 成人毛片18女人A片免费观看成人在 |