在我看来,我用简单的方式写出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语句将由编译器优化是正确的吗?
答案 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>();