許多程式老骨腦袋都有這麼一張表,並且會背幾組特別數字:空白鍵是 32 (0x20),0 是 48 (0x30)、A 是 65 (0x41),加 32 可以變成 a 97 (0x61)...


圖片來源:維基百科

在 C# 做字串排序,一時恍忽,熊熊覺得 new[] { "Jeffrey","darkthread", } 排序 "J"effrey (ASCII 0x4a) 應該要排在 "d"arkthread (0x64) 前面,但事實不然:

猛然想起,.NET 字串排序先後是由 CultureInfo 決定,誰跟你 ASCII?(延伸閱讀:.NET 中文字串排序(筆劃、注音))

那... 如果我要依 ASCII 排序怎麼辦?請用 StringComparer.Ordinal,它還有個兄弟叫 StringComparer.OrdinalIgnoreCase,一樣依 ASCII,但不分大小寫,a 在 B 前面,A 在 a 前面。

寫段程式實測驗證:

void Main()
{
    var array = new[] { "0", "a", "b", "A", "B" };
	Action<IEnumerable<string>, string> dump = (a, n) => {
		Console.WriteLine(n);
		Console.WriteLine(new string('=', 36));
		Console.WriteLine(string.Join(" < ", a.ToArray()));
		Console.WriteLine();
	};
    
    dump(array, "Raw");
    Array.Sort(array);
    dump(array, "Sort");
    dump(array.OrderBy(o => o), "OrderBy");
    Array.Sort(array, StringComparer.Ordinal);
    dump(array, "Sort StringComparer.Ordinal");
    dump(array.OrderBy(o => o, StringComparer.Ordinal), 
		"OrderBy StringComparer.Ordinal");
	Array.Sort(array, StringComparer.OrdinalIgnoreCase);
	dump(array, "Sort StringComparer.OrdinalIgnoreCase");
}

打完收工。

Tips of sorting strings by ASCII code in .NET.


Comments

# by 小黑

哥是使用 LINQPad?請教適用的情境,感謝

# by Jeffrey

to 小黑,試寫幾行程式確認 API 用法或驗證想法可行性,不用建專案,按鈕就有結果。

Post a comment