List.OfType<>整个列表都是这种类型
本文关键字:种类 类型 列表 OfType List | 更新日期: 2023-09-27 18:06:44
我有一个架构,我们传递我们的数据节点作为IEnumerable<BaseNode>
。这一切都工作得很好,但在每个子类中,我们希望将这些存储为List<AnotherNode>
,因为该类中的所有内容都创建并使用AnotherNode
对象(我们有大约15个不同的子类)。
使用强类型列表不起作用的一个地方是根类方法,它返回类型IEnumerable<BaseNode>
,并且具有。net 3.5中的协方差限制,无法返回。(我们现在必须停留在。net 3.5。)
但是如果我有List<AnotherNode> data;
并返回data.OfType<BaseNode>();
-那就可以了。这是我的问题。
由于所有的数据类型都是BaseNode
-这个调用的性能影响是什么?因为另一种选择是,我必须在对性能影响很小的地方进行强制转换-但这也是一种情况,我们放弃了知道它的类型的所有内容
两件小事:
-
与产生枚举数中的每个项相关的开销很小,但可以测量。如果你需要关心这个,因为你在一个非常紧密的内循环中,你最好直接在列表上迭代一个for循环。
-
因为结果是
IEnumerable<BaseNode>
,并且已经通过一个生成的枚举函数进行了过滤,所以对Count()或ElementAt()等方法的后续调用将不会利用LINQ实现中的列表优化。这也不太可能成为问题,除非您经常使用这些扩展方法并且拥有非常多的元素。
您见过Cast<T>()
Linq操作符吗?它应该比OfType<T>()
更高效。
基本上,OfType<T>()
if (item is T) {
yield return (T)item;
}
对比Cast<T>()
的做法:
yield return (T)item;