在LINQ中对中文进行特定顺序的排序

在LINQ中对中文进行特定顺序的排序

常规讨论

大家好,想向大家请教一下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
5 分数

全部回复

  • 大写数字这种,只能自定义规则排序吧
    2014年3月13日 4:43
    10 分数
  • 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
    725 分数
  • 谢谢,不好意思没有及时回复。

    可能是我的例子举的不太好……随手就打了这些个中文数字 =。=

    实际上还有这样的,例如表中有一列记录的是状态,再举个例吧。。例如状态有“新建”、“进行”和“完成”三种(实际中有好多种),每次LINQ查询出来后按默认排序都是“进行”在前,我想让“新建”在最前面,有办法实现吗?

    谢谢。

    2014年3月20日 4:14
    5 分数
  • 呃,我自己想到一个办法,是利用在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
    5 分数
  • 呃,我自己想到一个办法,是利用在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
    14,720 分数
  • 您好,非常感谢回复。

    不过我尝试了一下发现会报错:System.NotSupportedException: LINQ to Entities 不识别方法“Boolean ContainsKey(System.String)”,因此该方法无法转换为存储表达式。

    LINQ没法转换这个方法吧。不过还是很谢谢提供这样一种思路!

阅读更多

没有更多推荐了,返回首页