昨天寫了一篇 SQL Server 依照筆畫和注音排序,那在 C# 中該如何使用筆畫和注音來排序呢?
假設我們有一個很簡單的 User 物件:
我們可以使用 CultureInfo 將文化資訊設定為 zh-TW ,達成依照筆畫排序:
那依照注音符號 ㄅㄆㄇㄈ 排序呢?我們可以使用替代排序名稱的識別碼(Alternate sort identifier)來達成:
但是上面的測試是在 .NET Framework 4.8 上執行的,如果在 .NET 8 中並不會真的使用注音符號排序,而是輸出使用筆畫排序的結果。
筆者一開始在 .NET 8 上面執行了非常多次,排序一直有問題,明明是很簡單的程式碼卻又卡在這裡好幾個小時。後來才想到難道是版本的問題?於是就降版試試看,在 .NET Framework 4.8 版就可以成功排序,不知道算不算是 BUG ,還是其實在說明文件中有寫,只是筆者沒有看到。
參考資料:
Microsoft.Learn - CultureInfo class
假設我們有一個很簡單的 User 物件:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
我們可以使用 CultureInfo 將文化資訊設定為 zh-TW ,達成依照筆畫排序:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
var users = new List<User>()
{
new User { Id = 1, Name = "丁一" },
new User { Id = 4, Name = "張三" },
new User { Id = 3, Name = "李四" },
new User { Id = 2, Name = "王五" },
};
var result = users
.OrderBy(x => x.Name, StringComparer.Create(new CultureInfo("zh-TW"), false))
.ToList();
foreach (var user in result)
{
Console.WriteLine(user.Name);
}
// 丁一
// 王五
// 李四
// 張三
那依照注音符號 ㄅㄆㄇㄈ 排序呢?我們可以使用替代排序名稱的識別碼(Alternate sort identifier)來達成:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
var users = new List<User>()
{
new User { Id = 1, Name = "丁一" },
new User { Id = 4, Name = "張三" },
new User { Id = 3, Name = "李四" },
new User { Id = 2, Name = "王五" },
};
var result = users
.OrderBy(x => x.Name, StringComparer.Create(new CultureInfo(0x00030404), false))
.ToList();
foreach (var user in result)
{
Console.WriteLine(user.Name);
}
// 丁一 // ㄉ
// 李四 // ㄌ
// 張三 // ㄓ
// 王五 // ㄨ
但是上面的測試是在 .NET Framework 4.8 上執行的,如果在 .NET 8 中並不會真的使用注音符號排序,而是輸出使用筆畫排序的結果。
筆者一開始在 .NET 8 上面執行了非常多次,排序一直有問題,明明是很簡單的程式碼卻又卡在這裡好幾個小時。後來才想到難道是版本的問題?於是就降版試試看,在 .NET Framework 4.8 版就可以成功排序,不知道算不算是 BUG ,還是其實在說明文件中有寫,只是筆者沒有看到。
參考資料:
Microsoft.Learn - CultureInfo class
感謝教學~
回覆刪除