Я действительно не уверен, что это будет стоить вашего времени ... рассмотрим следующую программу:
class DateCompare : IComparer<FileInfo>
{
public int Compare(FileInfo a, FileInfo b)
{
int result = a.LastWriteTime.CompareTo(b.LastWriteTime);
if (result == 0)
return StringComparer.OrdinalIgnoreCase.Compare(a.FullName, b.FullName);
return result;
}
}
public static void Main(string[] args)
{
DirectoryInfo root = new DirectoryInfo("c:\\Projects\\");
DateTime start = DateTime.Now;
long memory = GC.GetTotalMemory(false);
FileInfo[] allfiles = root.GetFiles("*", SearchOption.AllDirectories);
DateTime sortStart = DateTime.Now;
List<FileInfo> files = new List<FileInfo>(20000);
IComparer<FileInfo> cmp = new DateCompare();
foreach (FileInfo file in allfiles)
{
int pos = ~files.BinarySearch(file, cmp);
files.Insert(pos, file);
}
Console.WriteLine("Count = {0:#,###}, Read = {1}, Sort = {2}, Memory = {3:#,###}", files.Count, sortStart - start, DateTime.Now - sortStart, GC.GetTotalMemory(false) - memory);
}
Это вывод вышеуказанной программы:
Count = 16,357, Read = 00:00:03.5793579, Sort = 00:00:06.7776777, Memory = 5,758,976
Count = 16,357, Read = 00:00:03.2173217, Sort = 00:00:06.1616161, Memory = 7,339,920
Count = 16,357, Read = 00:00:03.5083508, Sort = 00:00:06.7556755, Memory = 10,346,504
Это выполняется за 3 секунды, выделяя от 5 до 10 МБ, сканируя 6 931 каталог и возвращая имена файлов по 16 КБ. Это в три раза больше того, о чем вы говорите, и я держу пари, что большую часть времени сканирует дерево каталогов (у меня нет каталога с файлами 5k) Наихудшие затраты всегда будут такими, если вы можете выбрасывать файлы, сопоставляя имена файлов, я бы порекомендовал это.