假设我有一个TestCollection类,用于保存Test类型的对象并定义为
public class TestCollection : CollectionBase
这允许我以
的形式遍历集合foreach(object o in collection)
...
或
foreach(Test t in collection)
但不允许我使用新的Linq查询。
如果我将类的定义更改为
public class TestCollection : CollectionBase, IEnumerable<Test>
并添加方法
public new IEnumerator<Test> GetEnumerator()
{
foreach (Test o in this.List)
yield return o ;
}
然后可以使用linq查询。
然而,这个新方法不只是为linq查询调用,而且还在遗留代码中调用(即在foreach(集合中的对象o)和foreach(集合中的Test)期间调用。
在迭代整个集合的旧方法和假设集合中的所有项目都是Test类型的新方法之间有什么区别吗?我知道添加IEnumerator方法会导致程序抛出异常,如果它找到除Test以外的任何类型,但想知道我是否忽略了任何东西。
答案 0 :(得分:13)
由于您处于2.0(或更高版本),可能只是继承自Collection<T>
?
public class TestCollection : Collection<Test> {
// your extra code here
}
然后,您可以免费获得IList<T>
,ICollection<T>
,IEnumerable<T>
,以及virtual
方法,override
可以{{1}}为您的行为留下印记。< / p>
答案 1 :(得分:2)
不,您将看到相同的结果,并且只会遇到一个额外的间接级别(因为新的GetEnumerator
方法只调用现有的GetEnumerator
方法并对其输出进行流式处理。)
答案 2 :(得分:0)
从迭代器编译的IEnumerator<T>
没有实现Reset
方法。 编辑:我的意思是它会抛出NotImplementedException
。
这没有什么问题,但是如果你想要Reset
方法,你必须编写自己的迭代器类,这并不难。