簡體   English   中英

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

[英]C# LINQ Orderby - How does true/false affect 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<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

在您的情況下,列表首先根據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因此它將在排序中排在最后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM