为什么ReSharper建议我将for循环转换为LINQ表达式?

CSh*_*ned 24 c# linq resharper for-loop

在Visual Studio中,Re-Sharper继续推荐我将for循环转换为linq表达式,但是这是什么原因?

哪个更快?

以下是一些示例循环,其中resharper建议使用linq转换:

foreach (XmlNode legendEntryNode in _legendEntryNodes)
{
    var xmlElement = legendEntryNode["FeatureType"];

    if (xmlElement == null || !xmlElement.InnerText.Equals(featuretype)) continue;

    var xmlNodeList = legendEntryNode.SelectNodes("Themes/Theme");

    if (xmlNodeList != null)

    foreach (XmlNode themeNode in xmlNodeList)
    {
        var element = themeNode["Value"];

        if (element == null || !element.InnerText.Equals(v)) continue;

        var xmlElement1 = themeNode["Icon"];

        if (xmlElement1 != null)
        {
            string iconname = "<ms:ICON>" + xmlElement1.InnerText + "</ms:ICON>";

            var element1 = themeNode["Highlight"];

            if (element1 != null)
            {
                string highlightname = "<ms:HIGHLIGHT>" + element1.InnerText + "</ms:HIGHLIGHT>";
                gml = gml.Insert(c, iconname + highlightname);

                c += (iconname.Length + highlightname.Length);
            }
        }
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个更简单的例子:

for (int i = 0; i < getPointsRequest.Attribs.Length; i++)
{
    string attribName = getPointsRequest.Attribs[i].AttributeName;

    if (!String.IsNullOrEmpty(attribName))
    {
        sqlQuery += "<ms:" + attribName + ">||\"" + attribName + "\"||</ms:" + attribName + ">";
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 36

速度通常与代码的大部分无关 - 您应该以最简单的方式编写代码,然后对其进行测量以确保其足够快.

如果你的for循环真的只是查询,那么LINQ 绝对是一个结束更可读代码的好方法.它不是普遍适用的,但是你应该至少经常记住它.

通常,for循环可以转换为懒惰地计算的查询,然后是foreach循环,它对查询返回的每个值执行一些操作.这可以帮助区分这两个方面,让您在阅读代码时一次关注一个方面.将LINQ查询保留查询非常重要,而不是在其中使用副作用 - 它的设计目的是提供一种功能性方法,它实际上不会与副作用混合得很好.

如果你有一些具体的例子,我们可以提供更多关于转换为使用LINQ哪些循环有意义的意见,哪些不会.

  • @CSharpened:这是一个很大的假设,你应该在尝试微观优化之前进行验证.通常,性能受*体系结构*和整体设计的影响远远大于代码的各个部分,并且瓶颈通常也在IO而不是处理中.您应该确定性能要求是什么,测量满足您需求的最清晰代码的性能,然后*如果*需要优化,使用分析器以有针对性的方式执行此操作.我当然不会认为所有代码区域都会对整体性能产生统一影响. (7认同)
  • @CSharpened:如果您是一个更大的团队的一员,您应该询问您的团队成员对您的项目部分的性能要求.他们可能没有考虑过 - 你应该巧妙地建议对整个系统进行基准测试是有用的,并且如果总体性能不令人满意,那么分析哪些领域是瓶颈. (5认同)

Ama*_*ure 16

没有性能提升,但有一些好处

  • 使代码更具可读性.
  • 减少行数.
  • 易于维护.
  • 在某些情况下,您不需要临时变量,这可能是for循环中可能需要的.使用Linq,您可以链接查询.

有关详细信息,请参阅:

希望这对你有所帮助.


brg*_*ner 6

一般来说,ReSharper 的建议只是建议,没有警告。因此,您只能决定采用哪种方式:LINQ 还是 foreach。
我对建议“使用'var'”有同样的问题。仅当我认为读者可以更好地阅读该声明时,我才会点击该建议。
可读性是我编写代码时最优先考虑的事情之一。