在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提供了更好的方法?
谢谢大家了。
- 已编辑 huhubun 2014年3月20日 6:30 想到一个新方法
- 已更改类型 Fred BaoModerator 2014年3月21日 7:21
全部回复
-
呃,我自己想到一个办法,是利用在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)
这样以后要修改是,只需要更改字典的内容就可以了,不需要更改排序的代码。
-
您好,非常感谢回复。
不过我尝试了一下发现会报错:System.NotSupportedException: LINQ to Entities 不识别方法“Boolean ContainsKey(System.String)”,因此该方法无法转换为存储表达式。
LINQ没法转换这个方法吧。不过还是很谢谢提供这样一种思路!