[英]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
的值為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
因此它將在排序中排在最后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.