·天新網首頁·加入收藏·設為首頁·網站導航
數碼筆記本手機攝像機相機MP3MP4GPS
硬件臺式機網絡服務器主板CPU硬盤顯卡
辦公投影打印傳真
家電電視影院空調
游戲網游單機動漫
汽車新車購車試駕
下載驅動源碼
學院開發設計
考試公務員高考考研
業界互聯網通信探索
您現在的位置:天新網 > 軟件開發 > .Net開發 > C#
[C#基礎知識系列]專題十一:迭代器
http://www.waidoj.tw 2012年12月04日

1 2 下一頁

C# 1.0中我們經常使用foreach來遍歷一個集合中的元素,然而一個類型要能夠使用foreach關鍵字來對其進行遍歷必須實現IEnumerable或IEnumerable<T>接口,(之所以來必須要實現IEnumerable這個接口,是因為foreach是迭代語句,要使用foreach必須要有一個迭代器才行的,然而IEnumerable接口中就有IEnumerator GetEnumerator()方法是返回迭代器的,所以實現了IEnumerable接口,就必須實現GetEnumerator()這個方法來返回迭代器,有了迭代器就自然就可以使用foreach語句了),然而在C# 1.0中要獲得迭代器就必須實現IEnumerable接口中的GetEnumerator()方法,然而要實現一個迭代器就必須實現IEnumerator接口中的bool MoveNext()和void Reset()方法,然而 C# 2.0中提供 yield關鍵字來簡化迭代器的實現,這樣在C# 2.0中如果我們要自定義一個迭代器就容易多了。下面就具體介紹了C# 2.0 中如何提供對迭代器的支持.

一、迭代器的介紹

  迭代器大家可以想象成數據庫的游標,即一個集合中的某個位置,C# 1.0中使用foreach語句實現了訪問迭代器的內置支持,使用foreach使我們遍歷集合更加容易(比使用for語句更加方便,并且也更加容易理解),foreach被編譯后會調用GetEnumerator來返回一個迭代器,也就是一個集合中的初始位置(foreach其實也相當于是一個語法糖,把復雜的生成代碼工作交給編譯器去執行)。

二、C#1.0如何實現迭代器

  在C# 1.0 中實現一個迭代器必須實現IEnumerator接口,下面代碼演示了傳統方式來實現一個自定義的迭代器:

using System;   
 using System.Collections;   
        
 namespace 迭代器Demo   
 {   
     class Program   
     {   
         static void Main(string[] args)   
         {   
             Friends friendcollection = new Friends();   
             foreach (Friend f in friendcollection)   
             {   
                 Console.WriteLine(f.Name);   
             }   
        
             Console.Read();   
         }   
     }   
        
     /// <summary>   
     ///  朋友類   
     /// </summary>   
     public class Friend   
     {   
         private string name;   
         public string Name   
         {   
             get { return name; }   
             set { name = value; }   
         }   
         public Friend(string name)   
         {   
             this.name = name;   
         }   
     }   
        
     /// <summary>   
     ///   朋友集合   
     /// </summary>   
     public class Friends : IEnumerable   
     {   
         private Friend[] friendarray;   
        
         public Friends()   
         {   
             friendarray = new Friend[]   
             {   
                 new Friend("張三"),   
                 new Friend("李四"),   
                 new Friend("王五")   
             };   
         }   
        
         // 索引器   
         public Friend this[int index]   
         {   
             get { return friendarray[index]; }   
         }   
        
         public int Count   
         {   
             get { return friendarray.Length; }   
         }   
        
         // 實現IEnumerable<T>接口方法   
        public  IEnumerator GetEnumerator()   
         {   
             return new FriendIterator(this);   
         }   
     }   
        
     /// <summary>   
     ///  自定義迭代器,必須實現 IEnumerator接口   
     /// </summary>   
     public class FriendIterator : IEnumerator   
     {   
         private readonly Friends friends;   
         private int index;   
         private Friend current;   
         internal FriendIterator(Friends friendcollection)   
         {   
             this.friends = friendcollection;   
             index = 0;   
         }   
        
         #region 實現IEnumerator接口中的方法   
         public object Current   
         {   
             get
             {   
                 return this.current;   
             }   
         }   
        
         public bool MoveNext()   
         {   
             if (index + 1 > friends.Count)   
             {   
                 return false;   
             }   
             else
             {   
                 this.current = friends[index];   
                 index++;   
                 return true;   
             }   
         }   
        
         public void Reset()   
         {   
             index = 0;   
         }   
        
         #endregion    
     }   
 }

運行結果(上面代碼中都有詳細的注釋,這里就不說明了,直接上結果截圖):

[C#基礎知識系列]專題十一:迭代器

三、使用C#2.0的新特性簡化迭代器的實現

  在C# 1.0 中要實現一個迭代器必須實現IEnumerator接口,這樣就必須實現IEnumerator接口中的MoveNext、Reset方法和Current屬性,從上面代碼中看出,為了實現FriendIterator迭代器需要寫40行代碼,然而在C# 2.0 中通過yield return語句簡化了迭代器的實現,下面看看C# 2.0中簡化迭代器的代碼:

namespace 簡化迭代器的實現   
 {   
     class Program   
     {   
         static void Main(string[] args)   
         {   
             Friends friendcollection = new Friends();   
             foreach (Friend f in friendcollection)   
             {   
                 Console.WriteLine(f.Name);   
             }   
        
             Console.Read();   
         }   
     }   
        
     /// <summary>   
     ///  朋友類   
     /// </summary>   
     public class Friend   
     {   
         private string name;   
         public string Name   
         {   
             get { return name; }   
             set { name = value; }   
         }   
         public Friend(string name)   
         {   
             this.name = name;   
         }   
     }   
        
     /// <summary>   
     ///   朋友集合   
     /// </summary>   
     public class Friends : IEnumerable   
     {   
         private Friend[] friendarray;   
        
         public Friends()   
         {   
             friendarray = new Friend[]   
             {   
                 new Friend("張三"),   
                 new Friend("李四"),   
                 new Friend("王五")   
             };   
         }   
        
         // 索引器   
         public Friend this[int index]   
         {   
             get { return friendarray[index]; }   
         }   
        
         public int Count   
         {   
             get { return friendarray.Length; }   
         }   
        
         // C# 2.0中簡化迭代器的實現   
         public IEnumerator GetEnumerator()   
         {   
             for (int index = 0; index < friendarray.Length; index++)   
             {   
                 // 這樣就不需要額外定義一個FriendIterator迭代器來實現IEnumerator   
                 // 在C# 2.0中只需要使用下面語句就可以實現一個迭代器   
                 yield return friendarray[index];   
             }   
         }   
     }   
 }

在上面代碼中有一個yield return 語句,這個語句的作用就是告訴編譯器GetEnumerator方法不是一個普通的方法,而是實現一個迭代器的方法,當編譯器看到yield return語句時,編譯器知道需要實現一個迭代器,所以編譯器生成中間代碼時為我們生成了一個IEnumerator接口的對象,大家可以通過Reflector工具進行查看,下面是通過Reflector工具得到一張截圖:

上一篇: C#委托基礎9——Invoke與委托
下一篇: C#委托基礎8——lambda表達式

1 2 下一頁

關于我們 | 聯系我們 | 加入我們 | 廣告服務 | 投訴意見 | 網站導航
Copyright © 2000-2011 21tx.com, All Rights Reserved.
晨新科技 版權所有 Created by TXSite.net
牛牛机器人