如何使用linq where子句而不是foreach循环读取字符串数组值

时间:2018-05-15 16:00:45

标签: c# linq

我想在下面的代码中使用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;
   }
}

2 个答案:

答案 0 :(得分:0)

就个人而言,我认为循环很好,但Linq中的功能等价物将是:

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

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

  

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

Linq不会让它变得更快。当你找到第一个匹配的文件停止会更快。 FirstOrDefault()会有效地执行此操作,向break循环添加foreach也是如此。如果没有找到文件,那么性能将是相同的(它将循环遍历所有文件)。

答案 1 :(得分:0)

这可能稍好一点。请注意,我使用EnumerateFiles代替GetFiles

var fileName = Directory.EnumerateFiles(path)
    .Select(Path.GetFileNameWithoutExtension)
    .Where(f => f == PumpSelectedItem.PumpGuid)
    .FirstOrDefault();
如果没有找到文件,

fileName为空。

我假设你想要在找到第一场比赛时停止寻找。