提高分揀文件的性能有了文件名給定的陣列,通過文件擴展名進行排序它最簡單了的方法是這樣的:通過擴展
Array.Sort(fileNames,
(x, y) => Path.GetExtension(x).CompareTo(Path.GetExtension(y)));
的問題是,在很長的列表(〜800K )排序需要非常長的時間,而整個文件名的排序速度更快幾秒鐘!
理論,還有就是優化它的方式:而不是使用Path.GetExtension()
和比較新創建的擴展,只有串,我們可以提供比從LastIndexOf('.')
開始,而無需創建新的字符串的現有的文件名字符串比較比較。
現在,假設我找到了LastIndexOf('.')
,我想重用本地.NET的StringComparer,並將其僅應用於LastIndexOf('.')
之後的字符串部分,以保留所有文化考量。沒有找到辦法做到這一點。
任何想法?
編輯:
隨着tanascius的主意,用char.CompareTo()
方法,我帶着我的尤伯杯快速文件擴展名-的Comparer,現在通過分類擴展快3個倍!它甚至比以某種方式使用Path.GetExtension()
的所有方法更快。你怎麼看?
編輯2:
我發現,這個實現不考慮文化,因爲char.CompareTo()
方法不考慮文化,所以這不是一個完美的解決方案。
任何想法?
public static int CompareExtensions(string filePath1, string filePath2)
{
if (filePath1 == null && filePath2 == null)
{
return 0;
}
else if (filePath1 == null)
{
return -1;
}
else if (filePath2 == null)
{
return 1;
}
int i = filePath1.LastIndexOf('.');
int j = filePath2.LastIndexOf('.');
if (i == -1)
{
i = filePath1.Length;
}
else
{
i++;
}
if (j == -1)
{
j = filePath2.Length;
}
else
{
j++;
}
for (; i < filePath1.Length && j < filePath2.Length; i++, j++)
{
int compareResults = filePath1[i].CompareTo(filePath2[j]);
if (compareResults != 0)
{
return compareResults;
}
}
if (i >= filePath1.Length && j >= filePath2.Length)
{
return 0;
}
else if (i >= filePath1.Length)
{
return -1;
}
else
{
return 1;
}
}
請參閱我編輯的答案...您可以通過實現更好的分支邏輯來改善您的代碼(在通用代碼路徑中的ifs更少)。要啓用一種文化,你必須將一個字符串轉換爲字符串,這將不幸再次放慢速度。 – tanascius 2010-05-21 11:48:46