List.OfType <>的性能影响是什么?整个列表是那种类型?

Dav*_*len 3 c# linq generics covariance

我有一个架构,我们将数据节点作为传递IEnumerable<BaseNode>.这一切都很好,但是在每个子类中我们都希望存储这些子类List<AnotherNode>,因为该类中的所有内容都创建并使用AnotherNode对象(我们有大约15个不同的子类).

使用更强类型列表的一个地方不起作用的是返回类型IEnumerable<BaseNode>且在.net 3.5中具有协方差限制的根类方法,该方法无法返回.(我们现在必须继续使用.net 3.5.)

但如果我有List<AnotherNode> data;并返回data.OfType<BaseNode>();- 这很好.所以这是我的问题.

由于所有数据都属于类型BaseNode- 这次通话的性能如何?因为替代方案是我必须在性能影响较小的地方施放 - 但这也是我们放弃一切知道它的类型的情况.

Dan*_*ant 9

两件小事:

  1. 在枚举器中产生每个项目有一个小但可衡量的开销.如果你需要关心这个,因为你处于一个非常紧密的内循环中,你最好直接在列表上使用for循环进行迭代.很可能这没关系.

  2. 因为结果已经IEnumerable<BaseNode>并且已经通过屈服枚举函数进行过滤,所以对Count()或ElementAt()等方法的后续调用将不会利用列表的LINQ实现中的优化.除非经常使用这些扩展方法并且具有大量元素,否则这也不太可能成为问题.


Dan*_*ite 8

你见过Cast<T>()Linq运营商吗?它应该比性能更高效OfType<T>().

基本上有一个条件是运行 OfType<T>()

if (item is T) {
    yield return (T)item;
}
Run Code Online (Sandbox Code Playgroud)

与之相反Cast<T>():

yield return (T)item;
Run Code Online (Sandbox Code Playgroud)

  • 我为此创建了一个基准,它显示了相反的情况:https://gist.github.com/Shazwazza/04e2e5642a316f4a87e52dada2901198 (2认同)