【问题标题】:How to read string array value using linq where clause instead of foreach loop如何使用 linq where 子句而不是 foreach 循环读取字符串数组值
【发布时间】:2018-05-16 00:21:49
【问题描述】:

我想对下面的代码使用 linq where 子句。我已经尝试过 foreach 循环,它的工作完美。但是 foreach 循环需要更多时间来处理大量数据。请提供任何有价值的建议,以使用 linq where 子句获得结果。

string path = @"D:/NewFolder";
var _path = Directory.GetFiles(path);
foreach (var file in _path)
{
   foundFile = Path.GetFileNameWithoutExtension(file);
   if (foundFile == PumpSelectedItem.PumpGuid)
   {
      fileName = foundFile;
      isValidFileFound = true;
   }
}

【问题讨论】:

  • 不知道为什么你认为 linq 会更快。
  • 我认为 linq 不是 foreach 循环,而是最简单的方法。请提出任何建议来制作这个 linq where 子句。
  • 每个路径包含两个不同的文件@Rufus
  • 不确定“每条路径”是什么意思。只显示了一条路径。我已经删除了我的评论,但这有什么关系呢?除了设置布尔值外,您没有对文件做任何事情。 @jhayden 发布了类似的答案。
  • 使用时应将break放在if中。

标签: c# linq


【解决方案1】:

这可能会更好一些。请注意,我使用EnumerateFiles 而不是GetFiles

var fileName = Directory.EnumerateFiles(path)
    .Select(Path.GetFileNameWithoutExtension)
    .Where(f => f == PumpSelectedItem.PumpGuid)
    .FirstOrDefault();

如果没有找到文件,fileName 为空。

我假设你想在找到第一个匹配项后停止查找。

【讨论】:

  • Directory.EnumerateFiles(path).Where(p => Path.GetFileNameWithoutExtension(p) == PumpSelectedItem.PumpGuid).FirstOrDefault()?
  • @JohnyL 如果你真的想,当然可以。您甚至可以将该 lambda 放入 FirstOrDefault 中,以摆脱 Where 以及。但是恕我直言,我写它的方式是我的首选方式,因为我认为它更具可读性。我也相信任何这样的转换对整个语句的运行时效率(如果有的话!)影响很小。
【解决方案2】:

我个人认为循环很好,但 functional 在 Linq 中的等价物是:

fileName = _path.Select(file => Path.GetFileNameWithoutExtension(file)) 
                .Where(fileName => fileName == PumpSelectedItem.PumpGuid)
                .LastOrDefault(); 
isValidFileFound = (fileName != null);

请注意,我使用LastOrDefault 的原因是您在找到文件后一直在循环,所以最后找到的文件将是您的结果。如果这不是您的意图,那么您可以使用FirstOrDefault 或更改您的循环以在找到一个循环后中断。

但是 foreach 循环处理大量数据需要更多时间

Linq 不会让它变得更快。 当你找到第一个匹配的文件时停止,这会让它变得更快。 FirstOrDefault() 将有效地做到这一点,将 break 添加到您的 foreach 循环中。如果没有找到文件,则两种方式的性能都是相同的(它将循环遍历所有文件)。

【讨论】:

  • 这不是等效的代码,但是...原始代码有效地设置了fileName = PumpSelectedItem.PumpGuid;,而您将其设置为文件的完整路径。
猜你喜欢
  • 2016-05-30
  • 2014-10-23
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2021-12-29
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多