gpt4 book ai didi

c# - 使用 C# 和 LINQ 如何找到重复的文件名?

转载 作者:行者123 更新时间:2023-11-30 19:23:56 24 4
gpt4 key购买 nike

我花了一些时间试图找到答案,我很接近但仍然卡住了。

假设您有以下文件夹和文本文件..

C:\dupfiles
C:\dupfiles\tarts
C:\dupfiles\tarts\moretarts

C:\dupfiles\tarts\lindsay.txt
C:\dupfiles\paris.txt
C:\dupfiles\britney.txt
C:\dupfiles\tarts\moretarts\britney.txt
C:\dupfiles\tarts\moretarts\paris.txt

我正在尝试运行显示重复项的 LINQ 查询(paris.txt 和 britney.txt)。在 SQL 中,您可以通过 group by 和 having 子句来执行此操作。

这是我目前的代码...

using System;
using System.IO;
using System.Linq;

class Program
{
public static void Main(string[] args)
{
String strPath = @"C:\dupfiles";

var filelist = from file in Directory.GetFiles(strPath, "*", SearchOption.AllDirectories)
select file
into files
select Path.GetFileName(files);

var duplicateNames = filelist.GroupBy(file => filelist)
.Where(group => group.Count() > 1)
.Select(group => group.Key);

foreach (var f in duplicateNames)
{
Console.WriteLine(f);
}

Console.WriteLine("Press <enter> to continue");
Console.ReadLine();
}
}

我不完全理解代码的工作原理,结果也不是我想要的。

这是输出...

System.Linq.Enumerable+WhereSelectArrayIterator`2[System.String,System.String]

在示例代码中,f 是一种类型...System.Linq.Enumerable.WhereSelectArrayIterator

我错过了一 block 拼图。谁能帮我?

最佳答案

其他答案都很好。如果你想坚持使用查询语法,那么你可以有这样的东西:

var duplicateNames = from filePath in Directory.GetFiles(strPath, "*", SearchOption.AllDirectories)
group filePath by Path.GetFileName(filePath) into files
where files.Count() > 1
select files;

为了可读性,我个人会选择引入一个 let 子句:

var duplicateNames = from filePath in Directory.GetFiles(strPath, "*", SearchOption.AllDirectories)
let filename = Path.GetFileName(filePath)
group filePath by filename into files
where files.Count() > 1
select files;

let 基本上是一个临时变量,您可以在整个查询过程中访问它。

然后您可以使用嵌套的 foreach 打印出这些项目,如 Joshua Miller 所演示的。

关于c# - 使用 C# 和 LINQ 如何找到重复的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42076993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com