c# LINQ order - true/false如何影响order

本文关键字:order 何影响 影响 false LINQ true | 更新日期: 2023-09-27 18:03:36

我正在研究LINQ排序,因为我有一个id列表,我需要按顺序对它们进行排序。但是,有些id需要优先于标准顺序。

给定这个c#代码(可以粘贴到。net Fiddle测试)的排序工作,因为我需要它,但我不明白为什么一个不(!)操作符在一个包含给我正确的排序?

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

如果我有一个Contains在我的排序,它不应该给排序优先级的行,返回真?相反,它似乎为返回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;}
  }
}

关于为什么会发生这种情况的解释是什么?

c# LINQ order - true/false如何影响order

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<bool>的例子来解释这一点。考虑下面的代码片段:

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

最后opList的值为false, false, true, true,这意味着当我们在布尔值列表上应用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的条件为真,因此它将在排序中排在最后。