我有一个FileInfo
数组,包含~200.000个文件条目。我需要找到所有具有相同文件名的文件。我需要每个重复文件的目录名和文件名,因为我想在之后重命名它们。
我已经尝试过了:
答案 0 :(得分:8)
听起来应该这样做:
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);
}
}
答案 1 :(得分:2)
这应该有效:
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);
}
}
然后,重复项将包含所有重复文件名的列表。
请注意,由于Windows文件名不区分大小写,因此您可能希望通过使用.ToUpperInvariant()
将所有文件名首先转换为大写来考虑这一点。