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

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

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

我预期的排序输出是( 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;} } } 

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

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

  • false = 0
  • true = 1

false价值自然会先来。 如果要反转订单,只需使用descending关键字:

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

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

如果要将“true”值设置为优先级,请使用OrderByDescending

订购不是优先级 – 它是关于序数值 。 您正在对布尔值执行升序,而false在该上下文中的序数值低于true

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

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

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

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

如果删除了!OrderBy它给你第一个排序结果,如1,9,3,4,2,6,8,7,5因为条件为5因此它将在排序中排在最后。