我有一个FileInfo
包含 ~200.000 个文件条目的数组。我需要找到所有具有相同文件名的文件。作为每个重复文件的结果,我需要目录名和文件名,因为我想在之后重命名它们。
我已经尝试过的:
- 将每个条目与整个列表与 2 For“循环”//坏主意进行比较,这将需要数小时甚至数天 ^^
- 尝试使用 Linq 排序 // 因为在写正确的语句之前我没有使用过 Linq,也许有人可以帮助我 :)
听起来应该这样做:
var duplicateNames = files.GroupBy(file => file.Name)
.Where(group => group.Count() > 1)
.Select(group => group.Key);
现在是学习 LINQ 的好时机。它非常有用 - 花时间学习它(甚至只是 LINQ to Objects)会很快得到回报。
编辑:好的,如果你想要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);
}
}
然后副本将包含所有重复文件名的列表。
请注意,由于 Windows 文件名不区分大小写,因此您可能希望通过首先使用 .ToUpperInvariant() 将所有文件名转换为大写来考虑这一点