Linq使用Null值排序

时间:2016-10-13 06:07:39

标签: c# linq linq-to-sql

我有一个带有一个字符串属性的类,它有时可以为null,或者它可以是一个整数,或者它可以是一个字符串。

我想在这个属性的基础上使用LINQ,按整数值的升序排序,然后是所有非整数值,最后是空值

如何制作处理场景的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表达式吗?

4 个答案:

答案 0 :(得分:3)

这种情况下的典型方法是首先通过某种优先级表达式排序,然后通过其他方式排序其余的(仅对相同的优先级生效)。在你的场景中,它可能是这样的:

var sorted_items =
    (from x in licenseitems_master
     let pageOrder = string.IsNullOrEmpty(x.Page) ? 2 : x.Page.All(char.IsDigit) ? 0 : 1
     orderby pageOrder, pageOrder == 0 ? Convert.ToInt32(x.Page) : 0, x.Page
     select x).ToList();

答案 1 :(得分:2)

以下是Linq的一种方法

  • 第一顺序是升序null / not nul
  • 然后按升序排序
  • 然后按升序排序

使用List<string>

进行测试
var input = new List<string>() { "1", null, "34", "6", "67", null, "r45", "j34", "s" };
List<string> result = input.OrderBy(x => x == null)
      .ThenBy(x => x != null && x.All(y => char.IsDigit(y)) ? int.Parse(x) : int.MaxValue)
      .ThenBy(x => x).ToList();

我也更喜欢这种情况的自定义比较器(更容易阅读/维护),但问题是关于Linq方法

答案 2 :(得分:2)

你也可以选择类似的东西。

首先:TryParse为int,并按该值排序(如果你不能解析,则用Int32.MaxValue替换值,这将把这些值放在最后)。

第二:在结尾处输入null。

第三:按&#34;字符串&#34;的顺序排序值

int outValue;
var result = input
                .OrderBy(m => Int32.TryParse(m, out outValue)
                    ? outValue
                    : Int32.MaxValue)
                .ThenBy(m => m == null)
                .ThenBy(m => m)
                .ToList();

答案 3 :(得分:0)

也许你可以使用这种比较器:

public class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x == null && y == null) return 0;
        if (x == null) return 1;
        if (y == null) return -1;

        if (x.All(char.IsDigit) && y.All(char.IsDigit))
        {
            var n1 = Convert.ToInt32(x);
            var n2 = Convert.ToInt32(y);
            return n1 - n2;
        }
        return x.CompareTo(y);
    }
}

然后像这样使用它:

var myComparer = new MyComparer();
var sorted_items = "my master list".OrderBy(x => x.Page, myComparer).ToList();