溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C# 中怎么利用Iterator實(shí)現(xiàn)迭代器模式

發(fā)布時(shí)間:2021-07-07 16:14:18 來源:億速云 閱讀:130 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)C# 中怎么利用Iterator實(shí)現(xiàn)迭代器模式,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

C# Iterator迭代器模式我們在平時(shí)的開發(fā)中應(yīng)該經(jīng)常用到。不直接使用也會間接使用,我們使用foreach語句來循環(huán)就是在間接的使用C# Iterator迭代器模式。

迭代器就像指針一樣可以向前向后移動,在.NET中迭代器只能向后移動。

動機(jī):在軟件的構(gòu)建過程中,集合對象內(nèi)部結(jié)構(gòu)常常變化各異。但對于這些集合對象,我們希望在不暴露其內(nèi)部結(jié)構(gòu)的同時(shí),可以讓外部客戶代碼透明地訪問其中包含的元素;同時(shí)這種“透明遍歷”也為“同一種算法在多種集合對象上進(jìn)行操作”提供了可能。使用面向?qū)ο蠹夹g(shù)將這種遍歷機(jī)制抽象為“迭代器對象”為“應(yīng)對變化中的集合對象”提供了一種優(yōu)雅的方式。

意圖:提供一種方法順序訪問一個集合對象中的各個元素,而不暴露該對象的內(nèi)部表示。

public interface IEnumerable{  //得到迭代器  IEnumerator GetEnumerator();  }  /// <summary> /// 迭代器接口  /// summary> public interface IEnumerator{  //得到當(dāng)前的對象  object Current{  get;  }  bool MoveNext();  void Reset();  }  /// <summary> /// 集合類型,實(shí)現(xiàn)了可迭代接口  /// summary> public class MyCollection : IEnumerable{  internal int[] items;  public MyCollection(){  items = new int[5] {1, 2, 3, 4, 5};  }  #region IEnumerable 成員  //實(shí)現(xiàn)迭代接口,返回迭代器  public IEnumerator GetEnumerator(){  //在這里進(jìn)行解藕,將集合對象轉(zhuǎn)換為迭代器  return new MyEnumerator(this);  }  #endregion  }  //迭代器對象,實(shí)現(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 成員  //返回當(dāng)前迭代到的對象  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)換為了可迭代對象,這實(shí)際上是在對集合對象進(jìn)行抽象,將他轉(zhuǎn)換為迭代器。在這里,我們需要定義一個迭代器類,但是這是.NET 1.1中的做法,在.NET 2.0以后實(shí)現(xiàn)一個可迭代模式更加簡單。

/// <summary> /// 集合類型,實(shí)現(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迭代器模式。

以上就是C# 中怎么利用Iterator實(shí)現(xiàn)迭代器模式,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI