【问题标题】:Performance tuning for linq/lambda expressionlinq/lambda 表达式的性能调优
【发布时间】:2012-05-11 18:23:04
【问题描述】:

我有如下几行代码。

string result = listDetails
    .Where(filename => filename.Contains(fullname)).FirstOrDefault().Split('\\')
    .Where(name => name.Contains(nameGivenToSearch)).FirstOrDefault();

if (result.Contains("sd"))
    // Do something

在运行用于检查性能的工具时,它会在上述语句中显示性能警告。

我想让这种性能更加可行。我听说嵌套的 lambda 表达式执行速度较慢。

请提出一些解决此问题的建议或任何有助于解决问题的链接。

【问题讨论】:

  • 你能用简单的英语解释一下代码应该做什么吗?
  • 你能写出你需要满足的要求吗?目前你正在展示你是如何得到一些东西的,如果你说出你想要得到的东西可能会更容易。
  • 此代码无法编译:方法“包含”没有重载需要 0 个参数
  • 它正在搜索存在全名的文件名,并通过“\\”分割结果,然后再次在第一个结果字符串数据中搜索某些内容
  • 你在运行哪个“工具”?

标签: c# performance lambda performance-testing


【解决方案1】:

尝试将搜索到的数据(或全部,在您的应用启动之前)缓存到Dictionary<,>

【讨论】:

    【解决方案2】:

    我会改写为:

    string result = listDetails.FirstOrDefault(filename => filename.Contains(fullname));
    if (result != null)
        result = result.Split('\\').FirstOrDefault(name => name.Contains(namegiventosearch));
    if (result != null && result.Contains("sd"))
    {
         //do task
    }
    

    我认为性能提升空间不大。

    【讨论】:

      【解决方案3】:

      如果我的假设是正确的,即列表包含文件的路径,我认为主要问题是您拆分路径以获取文件名。请改用函数Path.GetDirectoryNamePath.GetFileName。搜索最多 1000 个字符串条目的列表不应该是繁重的处理器

          if (listDetails.Where(x => { if(Path.GetDirectoryName(x).Contains(fullname))
                                       {
                                          var file = Path.GetFileName(x);
                                          return file.Contains(namegiventosearch) && file.Contains("sd");
                                       }
                                       else 
                                       {
                                          return false;
                                   }
          }).FirstOrDefault() != null)
          {
               // do Task
          }
      enter code here
      

      【讨论】:

      • 使用Count() &gt; 0 而不是Any() 会严重影响性能。
      • 好点,编辑到FirstOrDefault,它不会枚举整个列表,而是
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多