2013-07-20 102 views
3

我創建了一個由間隔組成的數據結構。數據結構自然應該有一個列舉所有區間的枚舉器,但是我想公開兩個不同的枚舉器,它們以不同的順序枚舉區間。單個C#類的多個枚舉器

其中一個枚舉器枚舉真的很快,但以某種任意的順序。另一個按字典順序列舉它們,但稍慢(取決於時間間隔)。根據你試圖達到的目標,一個調查員可能會偏好另一個調查員。

有沒有辦法允許用戶決定在foreach循環中應該使用哪個枚舉器?如果沒有,我可以很容易地擁有一個用於在枚舉數之間切換的屬性,或者構造函數可以接受一個額外的參數。但我有點害怕它會比方便造成更多的困惑。

我應該爲另一個枚舉器創建一個返回IEnumerator的單獨方法嗎?對於這個奇怪的問題有沒有最佳做法?

回答

8

公開兩個返回不同枚舉數的屬性可能是正確的選擇。而不是你自己的數據結構IEnumerable本身(我猜那個),創建兩個不同的IEnumerator實現,並從每個主類中展示一個propery。然後使用代碼很簡單:

foreach(var item in data.FastEnumerator) 
{ 
    .... 

foreach(var item in data.LexicalEnumerator) 
{ 
    .... 
+0

絕妙的主意!真的很喜歡它:)由於數據結構是C5通用集合庫的一部分,因此必須實現IEnumerable 。我已經使集合的普通枚舉器成爲快速的「未排序」版本。排序後的版本通過GetEnumeratorSorted方法和屬性Sorted公開,因此集合可以像'foreach(var interval in collection.Sorted){}'那樣循環枚舉。像魅力一樣工作:D –

+0

你不能在IEnumerator上使用foreach,因爲它僅僅需要一個IEnumerable來完成預期的GetEnumerator方法。 –