迭代器是可以返回相同類型的值的有序序列的一段代碼。
迭代器可用作方法、運算符或get 訪問器的代碼體。
迭代器代碼使用yield return 語句依次返回每個元素。yield break 將終止迭代。
可以在類中實現多個迭代器。 每個迭代器都必須像任何類成員一樣有唯一的名稱,並且可以在foreach 語句中被客戶端代碼調用,如下所示:foreach(int x in SampleClass.Iterator2){}。
迭代器的返回類型必須為IEnumerable、IEnumerator、IEnumerable(Of T) 或IEnumerator(Of T)。
迭代器是LINQ 查詢中延遲執行行為的基礎。
yield 關鍵字用於指定返回的一個或多個值。 到達yield return 語句時,會保存當前位置。 下次調用迭代器時將從此位置重新開始執行。
迭代器對集合類特別有用,它提供一種簡單的方法來迭代復雜的數據結構(如二進制樹)。
--摘自MSDN
其實照我的理解來說,迭代器就是可以用foreach訪問的數據,也就說,是一個集合。
按照上面的迭代器返回類型來看,那麼我們自己也可以用類繼承迭代器的接口來實現我們自己的迭代器。
實現繼承IEnumerable接口的迭代器的類,需要實現GetEnumerator()方法,舉一個例子:
1 public class CityCollection : IEnumerable
2 {
3 string[] _Items = new string[] { "黑龍江", "吉林", "遼寧", "山東", "山西", "陝西", "河北", "河南", "湖南", "湖北", "四川", "廣西", "雲南", "其他" };
4 IEnumerator IEnumerable.GetEnumerator()
5 {
6 for (int i = 0; i < _Items.Length; i++)
7 {
8 yield return _Items[i];
9 }
10 }
11 }
這樣的話,就是一個基本的迭代類了,我們創建CityCollection對象後就可以使用foreach便利它了。
1 CityCollection collection = new CityCollection();
2 foreach (string item in collection)
3 {
4 Console.WriteLine(item);
5 }
但是IEnumerable是一個泛型接口,未加泛型的話,也就只能進行遍歷,而不能使用了LINQ查詢的方式對這個集合進行查詢或者其他操作了,所以,我們可以將上面的迭代類進行一下修改,增加泛型類型,修改如下:
1 public class CityCollection : IEnumerable<string>
2 {
3 string[] _Items = new string[] { "黑龍江", "吉林", "遼寧", "山東", "山西", "陝西", "河北", "河南", "湖南", "湖北", "四川", "廣西", "雲南", "其他" };
4 IEnumerator<string> IEnumerable<string>.GetEnumerator()
5 {
6 for (int i = 0; i < _Items.Length; i++)
7 {
8 yield return _Items[i];
9 }
10 }
11 IEnumerator IEnumerable.GetEnumerator()
12 {
13 for (int i = 0; i < _Items.Length; i++)
14 {
15 yield return _Items[i];
16 }
17 }
18 }
通過上面的修改,便利的時候就可以使用LINQ的進行自身的結果集查詢和其他的操作了,具體這個東西怎麼叫,我還真的不清楚,也表述不清楚,所以就這麼說,那位高手知道的話,還請指教,謝謝了。
1 static void Main(string[] args)
2 {
3 CityCollection collection = new CityCollection();
4 foreach (string item in collection)
5 {
6 Console.WriteLine(item);
7 }
8 Console.WriteLine("查詢方法:");
9 foreach (string item in collection.Where(t => t.Contains("河")))
10 {
11 Console.WriteLine(item);
12 }
13 System.Console.ReadKey();
14 }
高手可以無視的,但是希望高手給指教下,上面代碼中的where的查詢方式專業的名詞叫什麼,謝謝。
摘自 luacloud的日志