将IEnumerable <t>添加到派生自CollectionBase的类</t>

时间:2009-09-23 20:29:05

标签: c# generics collections

假设我有一个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以外的任何类型,但想知道我是否忽略了任何东西。

3 个答案:

答案 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方法,你必须编写自己的迭代器类,这并不难。