程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中迭代器的概念和兩種實現方式

C#中迭代器的概念和兩種實現方式

編輯:C#入門知識

1.首先我們看下IEnumerable接口定義:
  namespace System.Collections  
 {  
     // Summary:  
     //     Exposes the enumerator, which supports a simple iteration over a non-generic  
     //     collection.  
     [ComVisible(true)]  
     [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]  
     public interface IEnumerable  
     {  
         // Summary:  
         //     Returns an enumerator that iterates through a collection.  
         //  
         // Returns:  
         //     An System.Collections.IEnumerator object that can be used to iterate through  
         //     the collection.  
         [DispId(-4)]  
         IEnumerator GetEnumerator();  
     }  
 } 

 

這個接口是重中之重,迭代器就是實現這個接口才能使之迭代的。

2.C#的yield關鍵字您也必須知道
yield在迭代器塊中用於向枚舉數對象提供值或發出迭代結束信號。它有兩種表現形式:
yield return <expression>;
yield break;

請注意:
expression 必須可以隱式轉換為迭代器的 yield 類型
yield語句只能主線在迭代模塊中,而不能出現在不安全模塊,也不能出現在匿名方法中;當和 expression 一起使用時,yield return 語句不能出現在 catch 塊中或含有一個或多個 catch 子句的 try 塊中。

3.介紹迭代器概念
其實所謂迭代就是指循環,迭代器是指實現該循環的一種方式。
迭代器是C#2.0增加的功能,它可以是方法、get訪問器或運算符,最終它可以使您能夠在類或結構中支持foreach迭代。在實現上您不必實現整個IEnumerable接口,您只需提供一個迭代器即可,當編譯器監測到迭代器時間,她會自動生成IEnumerable 或 IEnumerable<T> 接口的 Current、MoveNext 和 Dispose 方法。
迭代器是可以返回相同類型的值的有序序列的一段代碼,它使用yield return語句一次返回每個元素,使用yield break終止迭代,它的返回類型必須是IEnumerable、 IEnumerator、IEnumerable<T> 或 IEnumerator<T>。

3.創建迭代器最常用的方法是實現IEnumerable接口中的GetEnumerator方法,IEnumerable接口如下:
 using System;  
 using System.Collections;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
   
 namespace ctochina.net  
 {  
     class Program  
     {  
         static void Main(string[] args)  
         {  
             MyIterator myIterator = new MyIterator();  
   
             foreach (int i in myIterator)  
             {  
                 Console.WriteLine(i);  
             }  
         }  
     }  
   
     public class MyIterator  
     {  
         public IEnumerator GetEnumerator()  
         {   
             for(int i=1;i<8;i++)  
             {  
                 yield return i;  
             }  
         }  
     }  
   
 } 

 

輸出:
1       2       3       4       5       6       7

注意System.Collections;命名空間的引用,因為IEnumerator在其中
由於是實現IEnumerable接口中的GetEnumerator方法,所以一個類中只能有一個GetEnumerator迭代。

4.另一種實現迭代的方法,代碼接著上例如:

 using System;  
 using System.Collections;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
   
 namespace ctochina.net  
 {  
     class Program  
     {  
         static void Main(string[] args)  
         {  
             MyIterator myIterator = new MyIterator();  
               
             //迭代一  
      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved