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

Dot*_* NF 29 .net c# linq sorting operators

我正在研究一些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;}
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Seb*_*ens 49

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

  • false = 0
  • true = 1

false价值自然会先到.如果您想要撤销订单,只需使用descending关键字:

var trueData = (from data in x
               orderby numbersToFilterBy.Contains(data.Id) descending, data.Id
                select data).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 在c#布尔值中没有数字表示.他们不是幕后的数字,我们假装是布尔,他们只是布尔.据说这个逻辑很可能会帮助人们记住排序是如何工作的(并且可能就是为什么.net的设计是这样的)但是值得记住的是.net中没有bool的数字表示. (8认同)
  • @Chris [`Convert.ToInt32(Boolean)`](https://msdn.microsoft.com/en-us/library/2cew9dz7.aspx)将`false`转换为'0`并将`true`转换为`1`. (5认同)
  • @Chris但是如果将布尔值转换为整数,则会有一个数值结果.这仍然比其他一些语言更多. (4认同)
  • @SebastianSchulz:这与布尔值是一个整数不同.所有`CompareTo`方法都返回一个整数.它只是如何比较工作.有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/system.icomparable.compareto(v=vs.110).aspx,但基本上0个menas它们是相等的,否定意味着实例出现在参数之前和积极意味着实例在参数之后.`CompareTo`的结果表示顺序,它在订购时不使用(即它不按CompareTo的结果排序,这听起来像你可能建议的那样). (4认同)
  • @JeanHominal:这是真的,但该方法中的代码完全独立于`Boolean.CompareTo`中的代码.它不会转换为整数来进行比较,它甚至不关心您是否可以根据整数来考虑布尔值.它只是定义在命令升序时false出现在true之前 - 任何地方都没有数字. (3认同)
  • @Chris`bool.CompareTo(bool)`返回整数,然后在订购时使用 (2认同)
  • @camerondm9:正如我似乎在重复的那样,这与布尔值与整数相同不同。该内部数字是 a) 实现细节,因此与布尔值的实际含义无关 b) 仅在转换为其他数据类型或 GetHashCode 实现时实际使用。无论布尔值和数字之间有多少相似之处,它们之间都没有语言级别的联系。 (2认同)

Jon*_*eet 23

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

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


mir*_*han 7

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


suj*_*lil 5

让我用一个List<bool>. 考虑以下片段:

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

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

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

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