【发布时间】:2012-11-16 13:20:57
【问题描述】:
工作中出现了一个讨论:
我们有一个具有 IList 的类。 Fact 是一个抽象基类,有几个具体的子类(PopulationFact、GdpFact 等)。
最初我们会以这种方式查询给定的事实,即按类型:
.Facts.FirstOrDefault(x => x.Year == 2011 && x is GdpFact)
然而,现在有人提出了我们是否应该引入 FactType 枚举来代替的问题
.Facts.FirstOrDefault(x => x.Year == 2011 && x.FactType == FactType.Gdp)
之所以提出该建议,是因为它据说速度更快。我承认我没有编写任何测试来尝试辨别性能差异,但我有两个问题:
1) 这样的“查询类型”本身就不好吗?
2) 考虑到事实是强类型的,添加 FactType 枚举不是多余的吗?
更新 澄清一下,这是 LINQ to objects 和 GdpFact:Fact。
更新 2 我们使用当前的典型数据(4 个事实)进行了测量,结果如下:
枚举查找:0.29660000000000003 毫秒 查找类型:0.24530000000000002 毫秒
所以在这种情况下类型查找更快!我会仔细选择我接受的答案。
【问题讨论】:
-
是 linq to objects 还是 linq to SQL?或者,更一般地说,您是在调用 Enumerable.FirstOrDefault 还是 Queryable.FirstOrDefault?另外,请注意,这两种方法并不等效。如果你有从 GdpFact 派生的事实类型,
x is GdpFact将是这些类型的实例,但x.FactType == FactType.Gdp可能是错误的。 -
那么,
Facts、IList<Fact>是什么类型的GdpFact:Fact?这似乎合乎逻辑,但你没有说。 -
.Facts.OfType<GdpFact>().FirstOrDefault(x => x.Year == 2011)也是一个选项。 -
无论任何人声称它都应该通过测试来支持
-
您考虑过
.OfType()方法吗?不确定这是如何实现的,因此对性能有影响,但它允许很好的声明性代码msdn.microsoft.com/en-us/library/bb360913.aspx
标签: c# .net performance linq