C # FileInfo - Найти дубликаты файлов - PullRequest
4 голосов
/ 25 января 2012

У меня есть массив FileInfo с ~ 200.000 записей в файле.Мне нужно найти все файлы с одинаковым именем файла.В результате в каждом дублирующемся файле мне нужно имя каталога и имя файла, потому что я хочу впоследствии переименовать их.

Что я уже пробовал:

  • Сравнение каждой записи со всем спискомwith 2 Для «циклов» // Плохая идея, для этого потребуются часы или даже дни ^^
  • Попытка использовать сортировку Linq // Поскольку я не использовал Linq, прежде чем у меня возникли трудности, чтобы написать правильное утверждение, может быть, кто-томожет помочь мне:)

Ответы [ 2 ]

8 голосов
/ 25 января 2012

Похоже, это должно сработать:

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

Сейчас самое подходящее время для изучения LINQ - .Это невероятно полезно - время, потраченное на его изучение (даже просто LINQ to Objects), окупится очень быстро.

РЕДАКТИРОВАТЬ: Хорошо, если вы хотите, чтобы оригинал FileInfo для каждой группы, просто сбросьте select:

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);
     }
}
2 голосов
/ 25 января 2012

Это должно работать:

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 ()

...