天天看點

[C#2] 5-疊代器1.枚舉數2.疊代器

1.枚舉數

枚舉數是循環通路其關聯集合的對象。它可被視作指向集合中任何元素的可移動的指針。 一個枚舉數隻能與一個集合關聯,但一個集合可以具有多個枚舉數。C#的foreach 語句使用枚舉數并隐藏操作該枚舉數的複雜性。枚舉數可用于讀取集合中的資料,但不能用于修改基礎集合。

集合要支援foreach則需要實作System.Collections.IEnumerable接口[公開枚舉數,該枚舉數支援在非泛型集合上進行簡單疊代, 也可以不實作該接口,該接口定義了一個方法GetEnumerator(),傳回一個支援IEnumerator接口的對象,IEnumerator的成員如下:

名稱 說明
bool MoveNex t方法 将枚舉數推進到集合的下一個元素
void Rese t方法 将枚舉數設定為其初始位置,該位置位于集合中第一個元素之前
object Current 屬性 擷取集合中的目前元素

寫一個:

1  
 2 public class MyCollections : IEnumerable
 3 {
 4     private string[] items;
 5     MyCollections(string[] items)
 6     {
 7         this.items = items;
 8     }
 9     public IEnumerator GetEnumerator()
10     {
11         return new MyEnumerator(this);
12     }
13     public class MyEnumerator : IEnumerator
14     {
15         private int position = -1;
16         private MyCollections mc;
17         public MyEnumerator(MyCollections mc)
18         {
19             this.mc = mc;
20         }
21         public bool MoveNext()
22         {
23             if (position < this.mc.items.Length - 1)
24             {
25                 position++;
26                 return true;
27             }
28             else
29             {
30                 return false;
31             }
32         }
33         public void Reset()
34         {
35             position = -1;
36         }
37         object IEnumerator.Current
38         {
39             get
40             {
41                 return this.mc.items[position];
42             }
43         }
44     }
45     static void Main()
46     {
47         MyCollections f = new MyCollections(
48                     new string[] { "亂舞春秋", "男", "22" });
49         foreach (string item in f)
50         {
51             Console.WriteLine(item);
52         }
53     }
54 }      

2.疊代器

C#2.0以前,要使自己的集合支援foreach周遊,需要寫上面一大堆代碼[實作兩個接口,也可不實作, 但是必須給提供這兩個接口中的同名方法],C#2.0引入了yield return[傳回每個元素]和yield break[終止疊代]兩個組合而成的上下文關鍵字。 改寫上述代碼:

//MyEnumerable方法全部删掉
public IEnumerator GetEnumerator()
{
    for (int i = 0; i < items.Length; i++)
    {
        yield return items[i];
    }
}      

就是這麼簡單!隻需實作一個接口IEnumerable就可以了[或者說有public IEnumerator GetEnumerator()此方法就可];

像是匿名方法一樣,編譯器幫我們做了很多[這裡編譯器幫我們生成了"實作IEnumerator接口的一個類",通過檢視IL代碼得知]。

作者:

Blackheart

出處:

http://linianhui.cnblogs.com

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀