【发布时间】:2017-02-22 03:12:31
【问题描述】:
我有一个具有一个字符串属性的类,它有时可以为空,有时可以是整数,也可以是字符串。
我想使用 LINQ 在此属性的基础上进行排序,整数值按升序排列,所有 nono 整数值下一个,最后为空值
如何制作处理场景的 LINQ 表达式
例子
"1" ,NULL , "34", "6" ,"67",NULL ,"r45","j34" ,"s" to be sorted as
"1" "6" "34" "67" "j34" "r45" "s" NULL NULL
我试过这样的东西,但不是很完美答案是
var licenseitems_master = my master list
var firstPart = licenseitems_master.Where(x => !String.IsNullOrEmpty(x.Page) && x.Page.All(char.IsDigit)).OrderBy(x => Convert.ToInt32(x.Page));
var secondPart = licenseitems_master.Where(x => !String.IsNullOrEmpty(x.Page) && !x.Page.All(char.IsDigit)).OrderBy(x => x.Page);
var thirdPart = licenseitems_master.Where(x => String.IsNullOrEmpty(x.Page)).ToList();
var sorted_items = firstPart.Union(secondPart).Union(thirdPart).ToList();
我们可以把它做成一个单一的 LINQ 表达式吗?
【问题讨论】:
-
您应该使用自己的比较器。好的解释在这里stackoverflow.com/questions/24841170/linq-custom-sort
-
你必须在你的类中重写
Equals和GetHashCode方法。然后就像var sorted_items = licenseitems_master.OrderBy(x => x.Page).ToList();一样简单 -
为什么一个变量有不同的数据类型?
-
它是客户的要求,页面有时可以是字符串,例如 rj45 或只是一个数字,它不是必填字段
-
@PawełHemperek:嗯,不是真的。只需从使用
Union更改为Concat即可避免使用 any 相等比较的代码。不过,自定义比较器是执行排序的正确方法。
标签: c# linq linq-to-sql