C#Linq在何处使用数组

C#Linq在何处使用数组,c#,arrays,linq,C#,Arrays,Linq,我想输出文件名数组中的所有值,并通过Where指令过滤掉它们。我试着把它圈起来。问题是,这些值会显示两次 var files = from file in Directory.EnumerateFiles(Path, "*.TXT", SearchOption.AllDirectories) from line in File.ReadLines(file) where line.Contains(Filename[i])

我想输出文件名数组中的所有值,并通过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错误?

编辑问题后: 使用以下代码获取现有文件:

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}");
使用此代码获取缺少的文件(名称):

或:

第二个文件的性能至少提高了两倍。尤其是在您根本不需要文件路径-->的情况下,因为缺少的文件没有文件路径


原问题: 可能是因为您的文件夹中有2个文件,但您正在使用相同的文件名进行检查,或者是因为您的文件中有2行与文件名匹配

回答您的问题更重要的是:
您想筛选出在中有自己名字的文件,还是想在所有文件在中有自己名字时只获取一次

您选择了前者,因此解决方案: 您可能注意到不需要数组。

编辑问题后: 使用以下代码获取现有文件:

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}");
使用此代码获取缺少的文件(名称):

或:

第二个文件的性能至少提高了两倍。尤其是在您根本不需要文件路径-->的情况下,因为缺少的文件没有文件路径


原问题: 可能是因为您的文件夹中有2个文件,但您正在使用相同的文件名进行检查,或者是因为您的文件中有2行与文件名匹配

回答您的问题更重要的是:
您想筛选出在中有自己名字的文件,还是想在所有文件在中有自己名字时只获取一次

您选择了前者,因此解决方案:

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

您的问题是否可以包括一些示例输入(即您正在处理的文件及其内容的代表性列表)和示例输出?请尝试创建最小的复制集。例如,目标目录中只有一个文件。在这种情况下,值是否显示两次?文件名可能出现在多个子文件夹中。因此,是否要包含完整路径名以使文件名唯一?或者使用Distinct()过滤重复项?我不会评论您的算法应该做什么以及可能存在哪些优化,但您需要意识到字符串
aabc.txt
包含字符串
abc.txt
。请您用简单的英语描述这个问题好吗?所以在一些路径中有
*.txt
文件;现在,您想列举文件,以便(请问条件是什么?)您的问题能够包括一些样本输入(即您正在处理的文件及其内容的代表性列表)和样本输出?尝试创建最小复制集。例如,目标目录中只有一个文件。在这种情况下,值是否显示两次?文件名可能出现在多个子文件夹中。因此,是否要包含完整路径名以使文件名唯一?或者使用Distinct()过滤重复项?我不会评论您的算法应该做什么以及可能存在哪些优化,但您需要意识到字符串
aabc.txt
包含字符串
abc.txt
。请您用简单的英语描述这个问题好吗?所以在一些路径中有
*.txt
文件;现在你想枚举文件,这样(请问条件是什么?)我不想在Foreach循环中,因为它显示我的输出两次,它显示两次只是因为你有文件名[I],其中我总是0,而不是因为Foreach本身;问题是它过滤了文件名[0]和文件名[1],但过滤后的内容确实会在第二轮循环中显示。我认为这是重复应用,因为它们是两个文件K420161.Txt和一个K464202.Txt,在foreach中,显示循环是2x Triggerd,一次有过滤器,另一次没有,但我不能释放1。Foreach,因为它运行。objekt数组。我不能释放Dispay循环,因为它在文件上运行,过滤掉其中有自己名字的文件,我不想在Foreach循环中,因为它显示我的输出两次它只显示两次,因为你有文件名[I],其中我总是0,而不是因为Foreach本身;问题是它过滤了文件名[0]和文件名[1],但过滤后的内容确实会在第二轮循环中显示。我认为这是重复应用,因为它们是两个文件K420161.Txt和一个K464202.Txt,在foreach中,显示循环是2x Triggerd,一次有过滤器,另一次没有,但我不能释放1。Foreach,因为它运行。objekt数组。我不能释放Dispay循环,因为它在文件上运行,过滤掉其中有自己名称的文件,
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);
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}");