支持详细Linq表达式
本文关键字:表达式 Linq 支持 | 更新日期: 2023-09-27 18:01:41
我突然想到,我以一种简单的方式写出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语句将被编译器优化是正确的吗?
没有;优化是由运行时完成的,而不是由编译器完成的。遵循您所描述的模式的LINQ-to-objects"Where"answers"Select"子句在运行时被优化为单个"Where - Select"对象,以避免创建过多的迭代器。(尽管正如乔恩·斯基特(Jon Skeet)所发现的,这有时会导致性能下降;就像几乎所有的"优化"一样,这并不是100%的成功。遗憾的是,我现在找不到Jon关于这方面的文章。
不,假设这些LINQ语句是由编译器优化的是不对的。更详细的语法会产生更多的Enumerator
对象,因此两者并不等同。从性能的角度来看,较短的语法会(稍微)更好。
但是,如果您从可读性和编码的角度在两种语法之间进行选择,我会选择第一种语法,因为它更好地显示了所采取的步骤。我总是更喜欢可读性而不是性能,除非你能证明存在性能瓶颈。
但是,有一个OfType<T>()
LINQ操作符可能会对您有用。你的第一个例子,重写为:
return _entries
.Where(x => x.Context.Equals(context))
.OfType<T>()
.Select(x => (T)x.Value)
.Single();
从长远来看,更好的编码实践是更具可读性的。如果您关心性能,那么测试这两种方法。如果它不值得测试,那么它就不值得优化。
我喜欢Linq表达式,因为它提供了一种声明式地表达代码意图的方法。它关注的是你想要实现什么而不是如何实现它。所以要强调代码的可读性。
但是用Linq操作符替换一些for/foreach块也可能使代码难以实现。所以我建议把你的表达式写成冗长的形式,这样你就可以口头地向你的合作程序员描述逻辑,例如下面的表达式可以被描述为"返回一个类型为T的单一值,其中条目context等于context, type等于T"。如果需要,编写自定义扩展方法,如将值强制转换为t类型的As<T>()
return _entries
.Where(x => x.Context.Equals(context) && x.Type == typeof (T))
.Single (x=> x.Value)
.As<T>();