Фильтрация массива с дубликатами элементов - PullRequest
3 голосов
/ 18 февраля 2011

У меня есть массив объектов FileInfo с дублирующимися элементами, которые я хотел бы отфильтровать, т.е. удалить дубликаты, элементы отсортированы по времени последней записи с помощью пользовательского компаратора.Формат имен файлов следующий:

file {number} {YYYMMDD} {HHMMSS} .txt

Что бы яхотелось бы знать, есть ли элегантный способ отфильтровать два файла с одинаковым номером, чтобы в списке присутствовал только самый последний, т.е. в моем массиве есть два элемента со следующими именами файлов:

file1_20110214_090020.txt

file1_20101214_090020.txt

Я хочу сохранить самую последнюю версию file1 .У меня есть следующий код для получения файлов:

 FileInfo[] listOfFiles = diSearch.GetFiles(fileSearch);
 IComparer compare = new FileComparer(FileComparer.CompareBy.LastWriteTime);
 Array.Sort(listOfFiles, compare);

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ:

Забыли добавить предостережение, рассматриваемая программаиспользует .Net 2.0, поэтому, к сожалению, нет LINQ.Извините за путаницу, выше я исправил номер файла, чтобы быть таким же,

Ответы [ 2 ]

5 голосов
/ 18 февраля 2011

С LINQ вы можете сделать:

var listOfFiles = diSearch
                  .GetFiles(fileSearch)
                  .GroupBy(file => file.Name.Substring(file.Name.IndexOf('_')))
                  .Select(g => g.OrderBy(file => file.LastWriteTime).Last())
                  .ToArray();

Если вы хотите, чтобы эти файлы также были упорядочены по времени последней записи, введите .OrderByDescending(file => file.LastWriteTime) перед вызовом ToArray.

Конечно, вы можете использовать более эффективную технику для поиска последних файлов из каждой группы, например, с помощью оператора MaxBy.

РЕДАКТИРОВАТЬ :

В .NET 2.0 вы можете создать Dictionary<string, List<FileInfo>> (с ключом, являющимся «файловой группой») из массива, а затем извлечь последний файл из каждого спискаValues коллекция словаря для получения результата.

Если вы находитесь на C # 3 или более поздней версии, другой вариант будет использовать LINQBridge , который позволяет использовать LINQ to Objects при нацеливании.NET 2.0.

0 голосов
/ 18 февраля 2011

Если я правильно вас понимаю, вы хотите определить самый последний файл, который определяется по имени файла (ГГГГММ и т. Д.), А не по времени последней записи и сгруппирован по времени записи идентификатора файла.В этом случае это будет работать:

var mostRecentFiles = listOfFiles.GroupBy( f => f.Name.Substring(0, f.Name.IndexOf("_")))
                                 .Select( g => g.OrderByDescending( f => 
                                         { string[] s =f.Name.Split(new [] {'_', '.'}); return Convert.ToDecimal(s[1]+s[2]);}).First())
                                 .ToList();
...