2013-07-20 63 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方法。 –