我使用Resharper,当我像这样编写几行代码时:
foreach (var posCombination in possibleCombinations)
{
if (posCombination .Count == combo.Count && posCombination .Select((l, i) => combo.Contains(l)).All(b => b))
{
return true;
}
}
return false;
它会问我是否要将其转换为LINQ表达式:
return possibleCombinations.Any(possibleCombination =>
possibleCombination.Count == combo.Count
&& possibleCombination.Select((l, i) => combo.Contains(l)).All(b => b));
我有很多人告诉我他们很难阅读LINQ语句中的内容......那么为什么我要将它转换为LINQ表达式,如果它使我的代码更少可读?
答案 0 :(得分:6)
这完全取决于你:如果你的代码的读者,包括你自己,更喜欢更详细的风格,一定要保留它:难以阅读聪明的代码在程序员的时间比在CPU时间要贵得多。毕竟,这只是ReSharper的暗示:关注或忽视它完全取决于你。
随着时间的推移阅读LINQ代码会变得更容易(我知道它对我来说变得更加容易,但是需要大量编写LINQ代码并查看其他团队成员编写的LINQ代码)。我们发现特别有用的一件事是评论:一个LINQ表达式可以在一小段代码中填充大量信息,因此用简单的英语拼出意图有助于在偶然发现我写过的一行时找出意思。几个月前。
答案 1 :(得分:3)
您已经在使用LINQ表达式,即代码的这一部分:
posCombination.Select((l, i) => combo.Contains(l)).All(b => b)
所以你可以回答自己的问题。你为什么决定在那里使用LINQ表达式?
我认为这比ReSharper所暗示的更多是LINQ表达式本身的问题。像其他人所说的那样,它们只是建议,由你来决定如何处理它们。我相信这个特殊的建议只需要清理,然后它会使你的代码更具可读性。首先,应缩短lamda表达式的参数名称,因为您可以从调用集合中推断出它是什么。其次,您的原始LINQ表达式可以简化为:
posCombination.All(x => combo.Contains(x))
这是由此产生的LINQ表达式:
return possibleCombinations.Any(p => p.Count == combo.Count &&
p.All(x => combo.Contains(x)));
现在它是一个简洁而又描述性的代码行,不需要您检查循环的内部。当然这只是一个建议。如果您希望可以使用更多描述性参数名称,请在方法中提取不太可读的部分,添加注释或坚持使用原始代码。
答案 2 :(得分:0)
您可以设置Resharper来改为提示。 你不必遵循它所做的每一个建议,说实话它可能很烦人。
return possibleCombinations.Any(possibleCombination => possibleCombination.Count == combo.Count && possibleCombination.Select((l, i) => combo.Contains(l)).All(b => b));
是一个例子,你什么时候不应该采取Resharper的建议。不是每个人都是Linq大师,我和一些实习生一起工作时就知道这一点。他们一直问我Linq代码的作用,甚至我的导师都不喜欢它。最好保持代码简单易读,易于维护。
当你想要完成的事情非常明显时,请使用Linq。
如果你厌倦了如何configure Resharper。
答案 3 :(得分:0)
我有很多人告诉我他们很难阅读LINQ语句中的内容......那么为什么我要将它转换为LINQ表达式,如果它使我的代码更少可读?
问题是现有代码看起来可读,因为开发人员已经习惯了很长时间。 LINQ语法相对较新(DB查询除外)。
最初,我一直在努力去理解简单的LINQ表达式,但是通过练习,我只是喜欢它。不否认一些LINQ表达式简直模糊(ex Aggregate)现在我可以轻松编写复杂的查询。
为什么要使用LINQ表达式?它简化了代码(减少了LOC),并提供了强大的构造(如排序,过滤,分组,延迟加载)