C# 2.0中的迭代器zz

 zz from WebCast—C#2.0銳利體驗

 

C# 2.0中的迭代器只是通過編譯器的一層額外處理,來簡化創建可用於foreach的枚舉集合的工作。

沒有迭代器的時候,創建一個可用於foreach的集合(C# 1.0):

public class MyCollection : IEnumerable 
{
    
public MyEnumerator GetEnumerator()
    
{
        
return new MyEnumerator(this);
    }


    
public class MyEnumerator : IEnumerator 
    
{
        
public void Reset(){… }
        
public bool MoveNext(){ … }
        
public int Currentget{ … } }
        
object IEnumerator.Current get{ … } }
    }

}



使用迭代器創建用於foreach的集合(C# 2.0):

public class Stack<T>: IEnumerable<T>//講義中的示例用的泛型接口IEnumerable<T>,但好像編譯不過
{
    T[] items;
    
int count;
    
public void Push(T data) {}
    
public T Pop() {return default(T);}
    
/*我覺得使用泛型接口IEnumerator<T>和IEnumerable<T>並沒有錯,但編譯卻有錯誤:error CS0536:“Test.TestStack<T>”不會實現接口成員“System.Collections.IEnumerable.GetEnumerator()”。Test.TestStack<T>.GetEnumerator()”或者是靜態、非公共的,或者有錯誤的返回類型。*/
    
public IEnumerator<T> GetEnumerator()
    
{
        
for(int i = count – 1; i >= 0--i)
            
yield return items[i];
    }

}


//下面的代碼用的非泛型接口IEnumerable,可以編譯通過並正確運行:)
public class TestStack<T>: IEnumerable
{
    T[] items 
= new T[10];
    
int count=0;
    
public void Push(T data) {}
    
public T Pop() {return default(T);}
    
public IEnumerator GetEnumerator()
    
{
 
for(int i = count-1; i>= 0--i)
     
yield return items[i];
    }

}



使用foreach語句:

Stack<int> stack = new Stack<int>();
foreach (int i in stack) { ……. }



使用迭代器創建倒序遍歷:

public IEnumerable<T> BottomToTop 
{
    
get {
       
for (int i = 0; i < count; i++{
           
yield return items[i];
       }

    }

}

 


使用yield return 產生枚舉元素:

for (int i = count – 1; i >= 0--i) {
    
yield return items[i];
}

 


使用yield break 中斷迭代:

for (int i = count – 1; i >= 0--i) {
    
yield return items[i];
    
if(items[i]>10)
        
yield break;
}
發佈了58 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章