2012年10月25日 星期四

自訂 List 排序規則

如果我們有一個資料結構,成員有 ID、標題、內容文字,
接著我們可以利用 List.Sort 的方法來針對多個物件做排序,
假設我們想要讓用戶可以依照筆劃、注音等方式自行選擇排序規則,
以下是個簡單的範例

public class Item
{
    public int ItemId = 0;
    public String ItemTitle = "";
    public String ItemDescription = "";
}

排序方法如下
範例程式碼內的 0x00000404 可以在這裡查到其他的 LCID
http://msdn.microsoft.com/en-us/library/a7zyyk0c(v=vs.71).aspx

public void SortSample()
{
    List<Item> itemList = new List<Item>();
    itemList.Add(new Item() { ItemTitle = "一" });
    itemList.Add(new Item() { ItemTitle = "二" });
    itemList.Add(new Item() { ItemTitle = "三" });
    itemList.Add(new Item() { ItemTitle = "四" });
    itemList.Add(new Item() { ItemTitle = "伍" });

    // 指定 Culture 為 zh-TW Stroke Count (筆劃排序)
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(0x00000404);
    itemList.Sort((A, B) => { return A.ItemTitle.CompareTo(B.ItemTitle); });
    foreach (Item s in itemList)
    {
        Debug.Write(s.ArtistName + " ");
    }
    // 結果輸出:一 二 三 四 伍

    // 指定 Culture 為 zh-TW Bopomofo (注音排序)
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(0x00030404);
    itemList.Sort((A, B) => { return A.ItemTitle.CompareTo(B.ItemTitle); });
    foreach (Item s in itemList)
    {
        Debug.Write(s.ArtistName + " ");
    }
    // 結果輸出:四 三 二 一 伍
}

此外,如果不想要利用改變 CurrentCulture 的方式,
也可以使用 CompareInfo 類別的 Compare 方法來比較兩個字串,
再將比較的方法寫入 Compare delegate 即可,CompareInfo 使用方法如下

CompareInfo strokeOrder = CompareInfo.GetCompareInfo(0x00000404); // 以筆劃比較
int n = strokeOrder.Compare("九", "玖"); // n = -1

比較需要注意的是,以上範例程式碼是在 WPF 之下執行的,
如果想要把這裡的指令用在 Windows Phone (Silverlight) 上面,
要注意一下 Windows Phone SDK 裡的 CultureInfo 類別只有字串一種建構方式,
請使用以下方式建構 CultureInfo Object

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW");

沒有留言:

張貼留言