1. 程式人生 > >在LINQ中對中文進行特定順序的排序

在LINQ中對中文進行特定順序的排序

在LINQ中對中文進行特定順序的排序

.NET 開發  >  ADO.NET 與 LINQ

常規討論

Discussion 登入進行投票 0 登入進行投票

大家好,想向大家請教一下LINQ中隊中文的排序問題。我只知道排序是按拼音進行的,模擬一下我的需求,現在有這樣一個數組

var
strArr = new String[] { "三", "一", "四", "五", "二", "六" };

想用LINQ排成 “一二三四五六” 的順序,請問有辦法實現嗎?

謝謝

————————————

2014年3月20日 更新

可能是我之前的例子舉的不太好啊……隨手就打了這些個中文數字,誤導了大家,自己也沒把需求說明白

實際上是這樣的,表中有一列記錄的是狀態,再舉個例吧。。例如狀態有“新建”、“進行”和“完成”三種(實際中有更多),每次LINQ查詢出來後按預設排序都是“進行”在前,我想讓“新建”在最前面,有辦法實現嗎?

謝謝。

————————————

還是 2014年3月20日 ,想到一個辦法,就是比較繁瑣,通過在Order方法裡面寫三目運算子可以生成CASE..WHEN..THEN語句,突發奇想試了一下發現可以,程式碼如下

(from t in table
select t).OrderBy(t => (t.State.Equals("新建") ? 1 :
                                   (t.State.Equals("進行") ? 2 :
                                   (t.State.Equals
("完成") ? 3 : 4))))

但是這樣子寫維護起來太麻煩了吧,有沒有好的推薦,或者是LINQ提供了更好的方法?

謝謝大家了。

2014年3月13日 3:35 回覆 | 引用 huhubun 5 分數

全部回覆

  • Discussion 登入進行投票 0 登入進行投票 大寫數字這種,只能自定義規則排序吧 2014年3月13日 4:43 回覆 | 引用 saaavsaaa 10 分數
  • Discussion 登入進行投票 0 登入進行投票

    http://blog.sina.com.cn/s/blog_63e177c50101504v.html

    請參照上面的C#大寫中文轉成數字(萬位以下適用),再使用

    var strArr = new String[] { "三", "一", "四", "五", "二", "六" };
    strArr = strArr.OrderBy(x => GetNumber(x)).ToArray();
    就可以將大寫中文排序。
    2014年3月13日 5:29 回覆 | 引用 David Kuo 725 分數
  • Discussion 登入進行投票 0 登入進行投票

    謝謝,不好意思沒有及時回覆。

    可能是我的例子舉的不太好……隨手就打了這些個中文數字 =。=

    實際上還有這樣的,例如表中有一列記錄的是狀態,再舉個例吧。。例如狀態有“新建”、“進行”和“完成”三種(實際中有好多種),每次LINQ查詢出來後按預設排序都是“進行”在前,我想讓“新建”在最前面,有辦法實現嗎?

    謝謝。

    2014年3月20日 4:14 回覆 | 引用 huhubun 5 分數
  • Discussion 登入進行投票 0 登入進行投票

    呃,我自己想到一個辦法,是利用在LINQ方法裡面書寫三目運算子能被理解成CASE..WHEN..THEN的SQL語句來實現的,試了一下沒有問題,就是做起來太繁瑣,也不好維護,程式碼如下

    (from t in table
    select t).OrderBy(t => (t.State.Equals("新建") ? 1 :
                                         (t.State.Equals("進行") ? 2 :
                                         (t.State.Equals("完成") ? 3 : 4))))

    還希望大家探討一下,謝謝了

    2014年3月20日 6:32 回覆 | 引用 huhubun 5 分數
  • Discussion 登入進行投票 0 登入進行投票

    呃,我自己想到一個辦法,是利用在LINQ方法裡面書寫三目運算子能被理解成CASE..WHEN..THEN的SQL語句來實現的,試了一下沒有問題,就是做起來太繁瑣,也不好維護,程式碼如下

    (from t in table
    select t).OrderBy(t => (t.State.Equals("新建") ? 1 :
                                         (t.State.Equals("進行") ? 2 :
                                         (t.State.Equals("完成") ? 3 : 4))))

    還希望大家探討一下,謝謝了

    Hi,你可以用一個字典來儲存不同內容預定義的次序值,比如

    private Dictionary<string, int> _priorityDic = new Dictionary<string, int>();
    
    ...
    _priorityDic["新建"] = 1;
    _priorityDic["進行"] = 2;
    _priorityDic["完成"] = 3;
    ...
    
    (from t in table
    select t).OrderBy(t => _priorityDic.ContainsKey(t.State.ToString()) ? _priorityDic[t.State.ToString()] : Int32.MaxValue)
    這樣以後要修改是,只需要更改字典的內容就可以了,不需要更改排序的程式碼。
    2014年3月21日 10:43 回覆 | 引用 lapheal 14,720 分數
  • Discussion 登入進行投票 0 登入進行投票

    您好,非常感謝回覆。

    不過我嘗試了一下發現會報錯:System.NotSupportedException: LINQ to Entities 不識別方法“Boolean ContainsKey(System.String)”,因此該方法無法轉換為儲存表示式。

    LINQ沒法轉換這個方法吧。不過還是很謝謝提供這樣一種思路!