赞成Verbose Linq的表达方式?

时间:2013-03-01 16:58:49

标签: c# .net linq clr

在我看来,我用简单的方式写出linq语句,但其他人可能将其定义为冗长的方式;

一个简单的例子:

return _entries
    .Where(x => x.Context.Equals(context))
    .Where(x => x.Type == typeof (T))
    .Select(x=>x.Value)
    .Cast<T>()
    .Single();

可以简化为:

return _entries
    .Where(x => x.Context.Equals(context) && x.Type == typeof (T))
    .Select(x=>(T)x.Value)
    .Single();

[问题] 从长远来看,这是更好的编码实践?即长(和简单)linq链或短linq链与更复杂的选择器/等?

假设这些Linq语句将由编译器优化是正确的吗?

4 个答案:

答案 0 :(得分:9)

  

从长远来看,哪种编码方式更好?

我更喜欢短而简单。它更具可读性。 LINQ的重点是使代码读取更像业务领域的逻辑。

  

假设这些Linq语句将由编译器优化是正确的吗?

没有;优化由运行时完成,而不是由编译器完成。 LINQ到对象跟随您描述的模式的“Where”和“Select”子句在运行时被优化为单个“where-select”对象,以避免创建太多的迭代器。 (尽管正如Jon Skeet所发现的那样,有时可能产生performance is actually degraded的情况;就像几乎所有的“优化”一样,它不是百分之百的胜利。不幸的是,我现在找不到Jon的文章。 。)

答案 1 :(得分:5)

不,假设这些LINQ语句由编译器优化是不对的。更冗长的语法会产生更多Enumerator个对象,因此这两个对象并不相同。从性能角度来看,较短的语法(略微)会更好。

但是,如果从可读性和编码的角度选择两种语法,我会选择第一种,因为它显示了更好的步骤。我总是喜欢可读性高于性能,除非你能证明存在性能瓶颈。

但是,您可能会发现OfType<T>() LINQ operator有用。你的第一个例子,重写:

return _entries
    .Where(x => x.Context.Equals(context))
    .OfType<T>()
    .Select(x => (T)x.Value)
    .Single();

答案 2 :(得分:4)

从长远来看,更好的编码实践是更具可读性的实践。如果您担心性能,请测试两种方法。如果它不值得测试那么就不值得优化。

答案 3 :(得分:1)

我喜欢Linq表达,因为它提供了一种声明性地表达代码意图的方法。它侧重于您希望实现的而非如何来实现它。因此强调代码的可读性。

但是Linq运算符替换了一些for / foreach块也可能使代码变得很麻烦。所以我建议你把你的表达写成冗长,这样你就可以向你的共同程序员口头描述逻辑,例如:以下表达式可以描述为 “返回单个值从类型T开始,其中条目上下文等于上下文,类型等于T”。如果需要,编写自定义扩展方法,例如将值转换为类型T的As<T>()

return _entries
    .Where(x => x.Context.Equals(context) && x.Type == typeof (T))
    .Single (x=> x.Value)
    .As<T>();