熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#中的Iterator迭代器模式

2013-11-13 09:47:00  來源: .NET編程 
迭代器模式我們在平時的開發中應該經常用到不直接使用也會間接使用我們使用foreach語句來循環就是在間接的使用迭代器模式
 
  迭代器就像指針一樣可以向前向後移動中迭代器只能向後移動
 
  動機在軟件的構建過程中集合對象內部結構常常變化各異但對於這些集合對象我們希望在不暴露其內部結構的同時可以讓外部客戶代碼透明地訪問其中包含的元素同時這種透明遍歷也為同一種算法在多種集合對象上進行操作提供了可能使用面向對象技術將這種遍歷機制抽象為迭代器對象應對變化中的集合對象提供了一種優雅的方式
 
  意圖提供一種方法順序訪問一個集合對象中的各個元素而不暴露該對象的內部表示
   /// <summary>
/// 可迭代接口
/// </summary>
public interface IEnumerable
{
//得到迭代器
IEnumerator GetEnumerator();
}

/// <summary>
/// 迭代器接口
/// </summary>
public interface IEnumerator
{
//得到當前的對象
object Current
{
get;
}

bool MoveNext();

void Reset();
}

/// <summary>
/// 集合類型實現了可迭代接口
/// </summary>
public class MyCollection : IEnumerable
{
internal int[] items;

public MyCollection()
{
items = new int[] { };
}

#region IEnumerable 成員

//實現迭代接口返回迭代器
public IEnumerator GetEnumerator()
{
//在這裡進行解藕將集合對象轉換為迭代器
return new MyEnumerator(this);
}

#endregion
}

//迭代器對象實現了迭代器接口
internal class MyEnumerator : IEnumerator
{

private int nIndex;
MyCollection collection;

    //構造函數將集合類型轉換成內部成員
public MyEnumerator(MyCollection coll)
{
llection = coll;
nIndex = ;
}


#region IEnumerator 成員

//返回當前迭代到的對象
public object Current
{
get
{
return ems[nIndex];
}
}

//移動到下一個對象指針向後移動
public bool MoveNext()
{
nIndex++;

return (nIndex < emsGetLength());
}

//重設迭代器指針回零
public void Reset()
{
nIndex = ;
}

#endregion
}

  很清楚在上面的代碼中我們通過GetEnumerator方法將集合對象轉換為了可迭代對象這實際上是在對集合對象進行抽象將他轉換為迭代器在這裡我們需要定義一個迭代器類但是這 中的做法 以後實現一個可迭代模式更加簡單

 /// <summary>
/// 集合類型實現了可迭代接口
/// </summary>
public class MyCollection : IEnumerable<int>
{
internal int[] items;

public MyCollection()
{
items = new int[] { };
}

#region IEnumerable<int> 成員

public IEnumerator<int> GetEnumerator()
{
for(int i = ; i < itemsLength; i++)
{
yield return items[i];
}
}
#endregion

#region IEnumerable 成員

SystemCollectionsIEnumerator SystemCollectionsIEnumerableGetEnumerator()
{
for(int i = ; i < itemsLength; i++)
{
yield return items[i];
}
}

#endregion
}
  我們通過yield return關鍵字來返回一個IEnumerator接口這個關鍵在在編譯之後會自動生成對應的迭代器的代碼
 
  中迭代器只能先前在c++中可以向後等其他操作
 
  注意在迭代的過程中我們不能向集合添加內容後移除集合裡的item這樣將會導致一些問題的出現


From:http://tw.wingwit.com/Article/program/net/201311/11575.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.