2016-08-23 94 views
21

我正在學習一點LINQ排序,因爲我有一個ID列表,我需要按順序排列它們。但是,某些ID需要優先於標準排序。C#LINQ Orderby - 真/假如何影響orderby?

鑑於此C#代碼(可以粘貼到.NET Fiddle測試)的排序工作,因爲我需要它,但我不明白,爲什麼在一個沒有(!)運算符包含是給我正確的順序?

我的預期訂購輸出是(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;} 
    } 
} 

這是怎麼回事?

回答

30

OrderBy方法將按照默認的升序排列項目。現在,假定一個布爾的數字表示的是:

  • false = 0
  • true = 1

false值自然會先。如果你想顛倒順序只使用descending關鍵字:

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

在c#中,布爾值不具有數字表示形式。他們不是幕後的數字,我們假裝是布爾人,他們只是布爾人。有人說過,邏輯可能會幫助人們記住排序是如何工作的(也可能是爲什麼.net的設計就是這種方式),但值得記住的是,在.net中沒有bool的數字表示形式。 – Chris

+3

@Chris但如果將布爾值轉換爲整數,則會出現數字結果。這比其他一些語言還要多。 –

+0

行'int test =(int)true;'拋出'Can not convert type'bool'to'int''的編譯器異常。你怎麼沒有錯誤投射? – Chris

19

基本上,false早於true ......認爲它們爲false = 0,true = 1。這與documentation for bool.CompareTo(bool)保持一致。

如果您想在開始時優先考慮「真」值,只需使用OrderByDescending

6

訂購不是優先 - 這是關於序號值。您正在對布爾值進行升序排序,並且false在此上下文中的序號值低於true

3

讓我一個List<bool>的一個例子來說明這一點。請看下面的代碼片段:

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

最後opList將有值falsefalsetruetrue這意味着假放在第一位,當我們在布爾值列表應用排序依據。這是因爲false被認爲是0,並且true將是1

在你的情況下,由data.Id的意志給你確切的結果作爲5, 1, 2, 3, 4, 6, 7, 8, 9列表中第一個分類爲5,1,9,3,4,2,6,8,7基礎上orderby !numbersToFilterBy.Contains(data.Id)即可。

如果您從它給你喜歡1,9,3,4,2,6,8,7,5第一個排序結果,因爲條件爲真爲5因此它會最後在排序中OrderBy!

+1

正如我在另一個答案中所說的,false從不被認爲是0和真1.它具有與它們相同的結果,但實際上它們只是定義了兩個布爾值的排序。這可能是挑剔的,但表明框架可能會將bools轉換爲整數是誤導性的,並不比他們剛剛定義的順序的真實陳述簡單。它可以幫助人們記住排序,如果它們習慣於在bools和數值之間進行轉換的語言。 – Chris