今天遇到的小問題,如下:

不長不短的人員姓名清單,想用 LINQ OrderBy 排序方便使用者尋找,排序結果有點怪,看不出依據為何。 加上 UT8 編碼後就清楚了,原來是依照 UTF8 編碼結果 byte[] 排列的:

爬文找到自己 9 年前的文章,才驚然想起,.NET 的字串排序可以靠 CultureInfo 控制,設成 zh-TW 即可改用筆劃排序。不過當年我用的方法是改 Thread.CurrentThread.CurrentCulture,更動當前執行緒的國別設定會影響其他程式碼,可能會有副作用。研究後我找到更好的寫法 - 用 StringComparer.Create() 傳入 CultureInfo 建立 StringComparer。

var sorted = names.OrderBy(o => o, StringComparer.Create(
		new System.Globalization.CultureInfo("zh-TW"),
		false //是否區分大小寫
	)).ToArray();

成功!

同場加映,那如果要依注音符號排序怎麼辦? 有些 CultureInfo 會所謂替代排序次序 (Alternate Sor Order),zh-TW 預設用筆劃排序 0x00000404、替代排序為注音 0x00030404,換言之,使用 CultureInfo(0x00030404) 建立 StringComparer,.NET 就會改用注音排序囉:

【延伸閱讀】

Tips of sorting Chinese strings with different order by .NET.


Comments

# by ByTIM

原來中文排序,是UTF8 編碼結果 byte[]排列阿! 筆畫、注意,都蠻特別的排序,希望以後能用到。 另外想問下有部首排序嗎?或是ㄅ、ㄆ、ㄇ排序?

Post a comment