C# Iterator迭代器模式
C# Iterator迭代器模式我們在平時的開發(fā)中應(yīng)該經(jīng)常用到。不直接使用也會間接使用,我們使用foreach語句來循環(huán)就是在間接的使用C# Iterator迭代器模式。
迭代器就像指針一樣可以向前向后移動,在.NET中迭代器只能向后移動。
動機:在軟件的構(gòu)建過程中,集合對象內(nèi)部結(jié)構(gòu)常常變化各異。但對于這些集合對象,我們希望在不暴露其內(nèi)部結(jié)構(gòu)的同時,可以讓外部客戶代碼透明地訪問其中包含的元素;同時這種“透明遍歷”也為“同一種算法在多種集合對象上進行操作”提供了可能。使用面向?qū)ο蠹夹g(shù)將這種遍歷機制抽象為“迭代器對象”為“應(yīng)對變化中的集合對象”提供了一種優(yōu)雅的方式。
意圖:提供一種方法順序訪問一個集合對象中的各個元素,而不暴露該對象的內(nèi)部表示。
- public interface IEnumerable{
 - //得到迭代器
 - IEnumerator GetEnumerator();
 - }
 - /// <summary>
 - /// 迭代器接口
 - /// summary>
 - public interface IEnumerator{
 - //得到當前的對象
 - object Current{
 - get;
 - }
 - bool MoveNext();
 - void Reset();
 - }
 - /// <summary>
 - /// 集合類型,實現(xiàn)了可迭代接口
 - /// summary>
 - public class MyCollection : IEnumerable{
 - internal int[] items;
 - public MyCollection(){
 - items = new int[5] {1, 2, 3, 4, 5};
 - }
 - #region IEnumerable 成員
 - //實現(xiàn)迭代接口,返回迭代器
 - public IEnumerator GetEnumerator(){
 - //在這里進行解藕,將集合對象轉(zhuǎn)換為迭代器
 - return new MyEnumerator(this);
 - }
 - #endregion
 - }
 - //迭代器對象,實現(xiàn)了迭代器接口
 - internal class MyEnumerator : IEnumerator{
 - private int nIndex;
 - MyCollection collection;
 - //構(gòu)造函數(shù)將集合類型轉(zhuǎn)換成內(nèi)部成員
 - public MyEnumerator(MyCollection coll){
 - this.collection = coll;
 - nIndex = -1;
 - }
 - #region IEnumerator 成員
 - //返回當前迭代到的對象
 - public object Current{
 - get{
 - return collection.items[nIndex];
 - }
 - }
 - //移動到下一個對象,指針向后移動
 - public bool MoveNext(){
 - nIndex++;
 - return (nIndex < collection.items.GetLength(0));
 - }
 - //重設(shè)迭代器,指針回零
 - public void Reset(){
 - nIndex = -1;
 - }
 - #endregion
 - }
 
很清楚,在上面的代碼中,我們通過GetEnumerator方法,將集合對象轉(zhuǎn)換為了可迭代對象,這實際上是在對集合對象進行抽象,將他轉(zhuǎn)換為迭代器。在這里,我們需要定義一個迭代器類,但是這是.NET 1.1中的做法,在.NET 2.0以后實現(xiàn)一個可迭代模式更加簡單。
- /// <summary>
 - /// 集合類型,實現(xiàn)了可迭代接口
 - /// summary>
 - public class MyCollection : IEnumerable<int>
 - {
 - internal int[] items;
 - public MyCollection()
 - {
 - items = new int[5] {1, 2, 3, 4, 5};
 - }
 - #region IEnumerable<int> 成員
 - public IEnumerator<int> GetEnumerator()
 - {
 - for(int i = 0; i < items.Length; i++)
 - {
 - yield return items[i];
 - }
 - }
 - #endregion
 - #region IEnumerable 成員
 - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
 - {
 - for(int i = 0; i < items.Length; i++)
 - {
 - yield return items[i];
 - }
 - }
 - #endregion
 - }
 
我們通過yield return關(guān)鍵字來返回一個IEnumerator接口,這個關(guān)鍵在在編譯之后會自動生成對應(yīng)的迭代器的代碼。
在.NET中迭代器只能先前,在c++中可以向后等其他操作。
注意:在迭代的過程中,我們不能向集合添加內(nèi)容,后移除集合里的item,這樣將會導(dǎo)致一些問題的出現(xiàn)。以上介紹C# Iterator迭代器模式。
【編輯推薦】















 
 
 


 
 
 
 