我什么时候应该将一个循环转换为Linq语句?

MBZ*_*MBZ 2 c# linq resharper loops

我最近使用ReSharper启动.

ReSharper建议将所有循环转换为集合(通常foreach)转换为Linq语句,即使循环包含各种条件.

  • 这会改善性能吗?
  • 这是否使代码更具可读性?

一般来说,我什么时候应该遵循ReSharper这个问题的建议,什么时候不应该?

Jon*_*Jon 9

这会改善性能吗?

通常,它不会影响性能.可以设计使用LINQ改善降低性能的情况,但在一般情况下则不行.

这是否使代码更具可读性?

很多时候是的,因为它取代了强调迭代机制的构造,强调了迭代的目的.

强调力学:

var jacks = new List<Person>();
foreach (var person in persons)
{
    if (person.Name == "Jack")
    {
        jacks.Add(person);
    }
}
Run Code Online (Sandbox Code Playgroud)

"这段代码遍历了人,每当它找到一个名为Jack的人时,它就会将它们添加到名为jacks的列表中".

强调目的:

var jacks = persons.Where(p => p.Name == "Jack").ToList();
Run Code Online (Sandbox Code Playgroud)

"把所有名叫杰克的人都列入名单.我们称之为名单杰克."

第二个版本要短得多也没有什么坏处,所以你的大脑可以比第一个版本更容易消耗它.

另一个例子:

var furryAnimals = furryThings.Intersect(animals).ToArray();
Run Code Online (Sandbox Code Playgroud)

绝对没有办法在没有LINQ或编写自己的等价物的情况下匹配清晰度.这里很明显furryAnimals包含任何内部furryThings和内部的内容animals.这就是你关心的一切.

并不关心如何计算这些集合的交集.计算可能涉及字典作为实现细节.但是,从创建该字典开始的代码的替代版本会立即引起您对最不重要的事情的关注:实现细节.

一般来说,我什么时候应该遵循ReSharper这个问题的建议,什么时候不应该?

规则总是有例外,所以我不会尝试在这里提出一个.但总的来说,我们希望代码是正确的,可维护的和快速的(通常按顺序).我将假设代码是正确的,所以无论何时你必须做出决定,总是考虑:

  • 更改是否使代码更清晰易懂?它是否会使代码在将来更容易修改?

如果您具有代码速度至关重要的具体证据,请考虑:

  • 哪个版本运行得更快?

  • LINQ使用lambdas(匿名委托).委托调用有点慢,委托创建更慢,后续委托必须是垃圾收集.当然,除非你在一个循环中使用LINQ一千次,否则这没关系. (2认同)