C# IEnumerable和IEnumerator介面的簡單介紹

來源:互聯網
上載者:User
本文主要介紹了C#中IEnumerable和IEnumerator介面的相關知識,具有很好的參考價值,下面跟著小編一起來看下吧

溫故而知新,可以為師矣,有空經常複習一下基礎知識是有必要的,並且能加深理解和記憶。

Foreach常用於逐一查看集合,對實現IEnumerable的介面的容器進行遍曆,IEnumerable和IEnumerator介面我有時候也有點迷糊,按官方的解釋,IEnumerable是列舉程式介面,IEnumerator是迭代器介面,從字面意思來看相差不大,逐一分析一下。

IEnumerable介面

public interface IEnumerable{  IEnumerator GetEnumerator();}

繼承IEnumerable介面的類需實現暴露出來的GetEnumerator()方法,並返回一個IEnumerator介面對象,看來真正做事的是IEnumerator,F12看一下IEnumerator又有什麼鬼東西。

IEnumerator介面

public interface IEnumerator{  object Current { get; } bool MoveNext();  void Reset();}

IEnumerator介面有三個東東,一個屬性Current,返回當前集合中的元素,方法MoveNext()移動到下一個,遍曆不都是向後遍曆的嘛,Reset(),字面意思重設,這個容易理解。做個假設:既然IEnumerable介面返回是IEnumerator介面迭代器來實現的,那麼僅繼承IEnumerator迭代器介面能不能實現一個自訂容器?

定義一個Phone類

public class Phone { public string Name; public Phone(string name) {  this.Name = name; }}

定義一個名為MyEnumerator迭代器,並現實它介面IEnumerator

public class MyEnumerator : IEnumerator{ Phone[] p; int idx = -1; public MyEnumerator(Phone[] t) {  p = t; } public object Current {  get  {  if (idx == -1)   return new IndexOutOfRangeException();  return p[idx];  } } public bool MoveNext() {  idx++;  return p.Length > idx; } public void Reset() {  idx = -1; }}
class Program { static void Main(string[] args) {       show("-----------IEnumerator------------");  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };  MyEnumerator enumerator = new MyEnumerator(phones);  while (enumerator.MoveNext())  {  Phone p = enumerator.Current as Phone;  show(p.Name);  }  Console.ReadKey(); } static void show(string i) {  Console.WriteLine(i); } }

結果顯示:

果然不出所料,真正做事情的是IEnumerator介面,即可逐一查看自訂的一個容器,不過,初衷是想用Foreach來做逐一查看、遍曆的。那好,那就只能顯示IEnumerable介面來做。稍稍改造一下Phone類:

public class Phone : IEnumerable { public string Name ; public Phone(string name) {  this.Name = name; } Phone[] p; public Phone(Phone[] t) {  p = t; } public IEnumerator GetEnumerator() {  return new MyEnumerator(p); } }
static void Main(string[] args) {  show("-----------IEnumerator------------");  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };  MyEnumerator enumerator = new MyEnumerator(phones);  while (enumerator.MoveNext())  {  Phone p = enumerator.Current as Phone;  show(p.Name);  }  show("-----------IEnumerable------------");  Phone phoneList = new Phone(phones);  foreach (Phone p in phoneList)  {  show(p.Name);  }  Console.ReadKey(); }

結果顯示:

大功告成,再擴充成通用的容器PhonePackage,繼承泛型IEnumerable<T>介面即可。

public class PhonePackage<T> : IEnumerable<T>  { private List<T> dataList = null; public void Add(T t) {  if (dataList == null)  dataList = new List<T>();  dataList.Add(t); } public IEnumerator<T> GetEnumerator() {  foreach (T t in dataList)  {  yield return t;  } } IEnumerator IEnumerable.GetEnumerator() {  foreach (T t in dataList)  {  yield return t;  } } }
static void Main(string[] args) {  show("-----------IEnumerator------------");  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };  MyEnumerator enumerator = new MyEnumerator(phones);  while (enumerator.MoveNext())  {  Phone p = enumerator.Current as Phone;  show(p.Name);  }  show("-----------IEnumerable------------");  Phone phoneList = new Phone(phones);  foreach (Phone p in phoneList)  {  show(p.Name);  }  show("-----------IEnumerable<T>------------");  PhonePackage<Phone> phonePackage = new PhonePackage<Phone>();  phonePackage.Add(new Phone("iPhone 7s"));  phonePackage.Add(new Phone("iPhone 6s"));  phonePackage.Add(new Phone("iPhone 5s"));  foreach (Phone p in phonePackage)  {  show(p.Name);  }  Console.ReadKey(); } static void show(string i) {  Console.WriteLine(i); }

結果顯示:

IEnumerator迭代器介面挺囉嗦的,yield是簡化了遍曆的文法糖而已。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.