C#LINQ Orderby - true / false如何影响orderby?

时间:2016-08-23 06:35:16

标签: c# .net linq sorting operators

我正在学习一些LINQ排序,因为我有一个ID列表,我需要按顺序排序。但是,某些ID需要优先于标准排序。

考虑到这个C#代码(可以粘贴到.NET Fiddle进行测试),排序按我需要的方式工作,但我不明白为什么a(!)运算符包含给我正确的订购?

我的预期排序输出是(5, 1, 2, 3, 4, 6, 7, 8, 9)。

如果我的订单中有Contains,那么它不应该为返回true的行赋予优先顺序吗?相反,它似乎为返回false的行提供排序优先级。

using System.Linq;
using System;

public class Program
{
  public static void Main()
  {
    var numbersToFilterBy = new [] {5, 11, 20};

    var x = new [] {new XClass(){Id = 1}, new XClass(){Id = 9}, new XClass(){Id = 5}, new XClass(){Id = 3}, new XClass(){Id = 4}, new XClass(){Id = 2}, new XClass(){Id = 6}, new XClass(){Id = 8}, new XClass(){Id = 7}};

    var trueData = (from data in x
                   orderby !numbersToFilterBy.Contains(data.Id), data.Id
                    select data).ToList();

    foreach(var item in trueData){
        Console.WriteLine(item.Id);
  }
}

public class XClass{
    public int Id{get;set;}
  }
}

为什么会发生这种情况有什么解释?

4 个答案:

答案 0 :(得分:38)

默认情况下,OrderBy方法会按升序对项目进行排序。现在,假设布尔值的数字表示为:

  • false = 0
  • true = 1

false值自然会首先出现。如果您想要撤销订单,只需使用descending关键字:

var trueData = (from data in x
               orderby numbersToFilterBy.Contains(data.Id) descending, data.Id
                select data).ToList();

答案 1 :(得分:21)

基本上,false早于true ...将它们视为false = 0,true = 1。这与documentation for bool.CompareTo(bool)保持一致。

如果您想在开始时优先考虑“true”值,请改用OrderByDescending

答案 2 :(得分:6)

订购与优先级无关 - 它与序数值有关。您正在对布尔值进行升序排序,@foreach($category->foods as $food) {{ $food->FoodName }} @endforeach 在该上下文中的序数值低于false

答案 3 :(得分:4)

让我用一个List<bool>的例子解释一下。请考虑以下代码段:

List<bool> BoolList = new List<bool>() { true, false, false, true };
var opList = BoolList.OrderBy(x => x).ToList();

最后,opList的值为falsefalsetruetrue,这意味着当我们将OrderBy应用于列表时,false会先出现布尔值这是因为false被视为0,而true将被视为1

在您的情况下,列表首先根据5,1,9,3,4,2,6,8,7排序为orderby !numbersToFilterBy.Contains(data.Id),然后data.Id将为您提供5, 1, 2, 3, 4, 6, 7, 8, 9的确切结果。

如果您从!中移除OrderBy,它会为您提供第一个排序结果,例如1,9,3,4,2,6,8,7,5,因为5的条件为真,因此它将在排序