Многоядерное программирование может на самом деле потребовать больше чем одной парадигмы. Некоторые текущие соперники:
Некоторые из этих парадигм дают Вам максимальную производительность, но только работают, если проблема разлагается чисто. Другие жертвуют некоторой производительностью, но позволяют более широкое множество алгоритмов. Я подозреваю, что некоторая комбинация вышеупомянутого в конечном счете станет стандартным инструментарием.
В Linux вы можете сравнить номера INode двух файлов, если они идентичны. Но под Windows такой концепции нет, по крайней мере, я не знаю. Вам нужно будет использовать p / invoke для разрешения ссылок, если таковые имеются.
Сравнение строк - лучшее, что вы можете сделать. Обратите внимание, что использование String.Compare (str1, str2, StringComparison.InvariantCultureIgnoreCase) немного быстрее, чем вы подходите.
Сравнение без учета регистра - лучшее, что вы можете получить. Извлеките его во вспомогательный класс на случай, если человечество найдет лучший метод.
public static class DirectoryInfoExtensions
{
public static bool IsEqualTo(this DirectoryInfo left, DirectoryInfo right)
{
return left.FullName.ToUpperInvariant() == right.FullName.ToUpperInvariant();
}
}
и используйте:
if (di1.IsEqualTo(di2))
{
// Code here
}
Вместо этого вы можете использовать объекты Uri. Однако ваши объекты Uri должны указывать на «файл» внутри этих каталогов. Этот файл на самом деле не обязательно должен существовать.
private void CompareStrings()
{
string path1 = @"c:\test\rootpath";
string path2 = @"C:\TEST\..\TEST\ROOTPATH";
string path3 = @"C:\TeSt\RoOtPaTh\";
string file1 = Path.Combine(path1, "log.txt");
string file2 = Path.Combine(path2, "log.txt");
string file3 = Path.Combine(path3, "log.txt");
Uri u1 = new Uri(file1);
Uri u2 = new Uri(file2);
Uri u3 = new Uri(file3);
Trace.WriteLine(string.Format("u1 == u2 ? {0}", u1 == u2));
Trace.WriteLine(string.Format("u2 == u3 ? {0}", u2 == u3));
}
Будет напечатано:
u1 == u2 ? True
u2 == u3 ? True