4

我有一个FileInfo包含 ~200.000 个文件条目的数组。我需要找到所有具有相同文件名的文件。作为每个重复文件的结果,我需要目录名和文件名,因为我想在之后重命名它们。

我已经尝试过的:

  • 将每个条目与整个列表与 2 For“循环”//坏主意进行比较,这将需要数小时甚至数天 ^^
  • 尝试使用 Linq 排序 // 因为在写正确的语句之前我没有使用过 Linq,也许有人可以帮助我 :)
4

2 回答 2

10

听起来应该这样做:

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);
     }
}
于 2012-01-25T11:01:42.890 回答
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() 将所有文件名转换为大写来考虑这一点

于 2012-01-25T11:16:42.420 回答