3

我使用 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 表达式呢?

4

4 回答 4

6

这完全取决于您:如果您的代码的读者(包括您自己)更喜欢更冗长的风格,请务必保留它:难以阅读的聪明代码在程序员的时间上比在 CPU 时间上要昂贵得多。毕竟,这只是 ReSharper 的提示:关注或忽略它完全取决于您。

随着时间的推移,阅读 LINQ 代码会变得更容易(我知道这对我来说确实变得容易多了,但是编写 LINQ 代码并查看其他团队成员编写的 LINQ 代码需要花费大量时间)。我们发现特别有用的一件事是注释:一个 LINQ 表达式可以在短短的代码行中包含惊人数量的信息,因此一旦我偶然发现我写的一行代码,用简单的英语拼出意图有助于弄清楚含义几个月前。

于 2012-09-29T14:38:49.383 回答
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)));

现在它是一个简洁但描述性的代码行,不需要您检查循环的内部结构。当然,这仍然只是一个建议。如果您愿意,您可以使用更具描述性的参数名称、将可读性较差的部分提取到方法中、添加注释或坚持使用您的原始代码。

于 2012-09-29T16:02:16.253 回答
0

我有很多人告诉我,他们很难阅读 LINQ 语句中发生的事情......那么,如果它使我的代码可读性降低,我为什么要将它转换为 LINQ 表达式呢?

问题是现有代码看起来可读,因为开发人员已经习惯了很长时间。LINQ 语法相对较新(数据库查询除外)。

最初我什至连简单的 LINQ 表达式都难以理解,但通过练习我很喜欢它。不否认某些 LINQ 表达式只是晦涩难懂的事实(例如Aggregate)现在我可以轻松编写复杂的查询。

为什么要使用 LINQ 表达式?它简化了代码(减少了 LOC),并提供了强大的结构(如排序、过滤、分组、延迟加载)

于 2012-09-29T15:14:31.463 回答
0

你可以设置 Resharper 来给你提示。您不必遵循它提出的每一个建议,老实说,这可能很烦人。

return possibleCombinations.Any(possibleCombination => possibleCombination.Count == combo.Count && possibleCombination.Select((l, i) => combo.Contains(l)).All(b => b));

是一个关于何时不应接受 Resharper 建议的示例。不是每个人都是 Linq 大师,我在和一些实习生一起工作时就知道这一点。他们一直问我的 Linq 代码是做什么的,甚至我的导师也不喜欢它。最好保持代码简单易读,从而易于维护。

当您想要完成的任务非常明显时,请使用 Linq。

如果您厌倦了,如何配置Resharper。

于 2012-09-29T14:35:00.573 回答