C#FileInfo-查找重复文件
我有一个C#FileInfo-查找重复文件,c#,file,fileinfo,C#,File,Fileinfo,我有一个FileInfo数组,包含约200.000个文件条目。我需要找到所有具有相同文件名的文件。我需要作为每个重复文件的结果的目录名和文件名,因为我想在以后重命名它们 我已经尝试过的: 将每个条目与整个列表进行比较,其中2个表示“循环”//坏主意,这将需要数小时甚至数天^^ 尝试使用Linq排序//因为我在写正确的语句之前没有使用Linq,也许有人可以帮我:) 听起来应该这样做: var duplicateNames = files.GroupBy(file => file.Name)
FileInfo
数组,包含约200.000个文件条目。我需要找到所有具有相同文件名的文件。我需要作为每个重复文件的结果的目录名和文件名,因为我想在以后重命名它们
我已经尝试过的:
- 将每个条目与整个列表进行比较,其中2个表示“循环”//坏主意,这将需要数小时甚至数天^^
- 尝试使用Linq排序//因为我在写正确的语句之前没有使用Linq,也许有人可以帮我:)
var duplicateNames = files.GroupBy(file => file.Name)
.Where(group => group.Count() > 1)
.Select(group => group.Key);
现在是学习LINQ的好时机。它非常有用——花在学习上的时间(即使只是LINQ到对象)会很快得到回报
编辑:好的,如果您想要每个组的原始FileInfo
,只需删除选择:
var duplicateGroups = files.GroupBy(file => file.Name)
.Where(group => group.Count() > 1);
// Replace with what you want to do
foreach (var group in duplicateGroups)
{
Console.WriteLine("Files with name {0}", group.Key);
foreach (var file in group)
{
Console.WriteLine(" {0}", file.FullName);
}
}
这应该起作用:
HashSet<string> fileNamesSet = new HashSet<string>();
List<string> duplicates = new List<string>();
foreach(string fileName in fileNames)
{
if(fileNamesSet.Contains(fileName))
{
duplicates.Add(fileName);
}
else
{
fileNamesSet.Add(fileName);
}
}
HashSet filenameset=newhashset();
列表重复项=新列表();
foreach(文件名中的字符串文件名)
{
if(filenameset.Contains(fileName))
{
重复项。添加(文件名);
}
其他的
{
添加(文件名);
}
}
然后,副本将包含所有重复文件名的列表
请注意,由于windows文件名不区分大小写,您可能希望首先使用.ToUpperInvariant()将所有文件名转换为大写,从而考虑到这一点。My Bad,您的解决方案非常有效,但是我不想说我需要知道每个重复的文件的名称-Directoy名称+文件名,因为我想重命名它们:)对不起,谢谢。太好了,我已经知道LINQ有时真的很方便,但我从来没有想到它会那么棒。如果允许我问一下,你有什么最喜欢的页面可以学习LINQ使用吗?@user1168998:不是真的-但是你可以查看MSDN,例如。你不需要先做包含检查-你可以调用
filenameset.Add(fileName)
并检查返回值,对于重复项,这将是错误的。我认为这样做的目的更清楚-即使不知道HashSet类,其含义也应该是显而易见的。就个人而言,我更希望知道我使用的API:)(集合添加方法返回是否真的进行了更改是很常见的-这并不是一个特别“隐藏”的方法你会使用ContainsKey,然后使用索引器而不是TryGetValue作为字典吗。我可以直接发表评论