赞成Verbose Linq的表达方式?

Mei*_*hes 2 .net c# linq clr

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

一个简单的例子:

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

可以简化为:

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

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

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

Eri*_*ert 9

从长远来看,这是更好的编码实践?

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

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

没有; 优化由运行时完成,而不是由编译器完成.LINQ到对象跟随您描述的模式的"Where"和"Select"子句在运行时被优化为单个"where-select"对象,以避免创建太多的迭代器.(尽管正如Jon Skeet所发现的那样,有时可能会出现性能下降的情况 ;就像几乎所有的"优化"一样,这并不是100%的胜利.不幸的是,我现在无法找到Jon的文章. )


Dan*_*ker 5

不,假设这些LINQ语句由编译器优化是不对的.更详细的语法会产生更多Enumerator对象,因此两者不等效.从性能角度来看,较短的语法(稍微)会更好.

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

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

return _entries
    .Where(x => x.Context.Equals(context))
    .OfType<T>()
    .Select(x => (T)x.Value)
    .Single();
Run Code Online (Sandbox Code Playgroud)