首页 > 解决方案 > C# Linq 在 where 中使用数组

问题描述

我想输出文件名数组中的所有值并通过 Where 指令将它们过滤掉。我试图循环它。问题是,这些值显示了两次。

var files = from file in Directory.EnumerateFiles(Path, "*.TXT", SearchOption.AllDirectories)
            from line in File.ReadLines(file)
            where line.Contains(Filename[i])
            select new
            {
                File = file,
                Line = line
            };
foreach (var line in files)
{
    Console.WriteLine($"{line.Line}");
}

我的逻辑有问题还是我使用 Linq 错误? 在此处输入图像描述

标签: c#arrayslinq

解决方案


问题编辑后:

使用此代码获取现有文件:

var txtPath = Path.Combine(dirPath, txtFileName);
var txtLines = File.ReadAllLines(txtPath).ToList();
var filesFound = from file in Directory.EnumerateFiles(dirPath, "*.DST", SearchOption.AllDirectories)
                 where txtLines.Contains(Path.GetFileName(file))
                 select new
                 {
                     File = file,
                     Line = Path.GetFileName(file)
                 };

foreach (var line in filesFound)
    Console.WriteLine($"{line.Line}");

使用此代码获取丢失的文件(名称):

var existingFiles = filesFound.Select(s => s.Line).ToList();
var missingFiles = txtLines.Except(existingFiles);

或者:

var txtPath = Path.Combine(dirPath, txtFileName);
var txtLines = File.ReadAllLines(txtPath).ToList();
var filesMissing = txtLines.Except(from file in Directory.EnumerateFiles(dirPath, "*.DST", SearchOption.AllDirectories)
                                   where txtLines.Contains(Path.GetFileName(file))
                                   select Path.GetFileName(file));

foreach (var line in filesMissing)
    Console.WriteLine(line);

第二个的性能至少要好两倍。特别是如果您根本不需要 filePath --> 因为丢失的文件没有文件。


对于原始问题:

也许您有重复,因为您的 foder 中有 2 个文件,但您使用相同的文件名进行检查,或者您的文件中有 2 行与文件名匹配。

回答你的问题更重要的是:

您想过滤掉其中有自己名称的文件,还是只想在所有文件中有自己的名称时获取一次

你选择了前者,所以解决方案:

var files = from file in Directory.EnumerateFiles(path, "*.TXT", SearchOption.AllDirectories)
            from line in File.ReadLines(file)
            where !line.Contains(System.IO.Path.GetFileName(file))  //note the exclamation mark, this is how you filter
            select new
            {
                File = file,
                Line = line
            };

foreach (var line in files)
    Console.WriteLine($"{line.Line}");

您可能注意到您不需要数组。


推荐阅读