2016-08-23 13 views
21

Tôi đã nghiên cứu một chút về thứ tự LINQ như tôi có một danh sách các Id, và tôi cần phải đặt hàng tuần tự. Tuy nhiên, có một số id nhất định cần được ưu tiên so với thứ tự tiêu chuẩn.C# LINQ Orderby - Làm cách nào để đúng/sai ảnh hưởng đến orderby?

Với C# mã này (có thể được dán vào .NET Fiddle để thử nghiệm) thứ tự làm việc như tôi cần nó, nhưng tôi không hiểu tại sao một không (!) điều hành trên chứa được đem lại cho tôi thứ tự có đúng không?

Sản lượng đặt hàng dự kiến ​​của tôi là (5, 1, 2, 3, 4, 6, 7, 8, 9).

Nếu tôi có Contains theo thứ tự của mình, không nên đặt ưu tiên đặt hàng cho các hàng trả về đúng? Thay vào đó, nó xuất hiện để ưu tiên thứ tự các hàng trả về 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;} 
    } 
} 

Giải thích tại sao điều này xảy ra?

Trả lời

30

Phương pháp OrderBy sẽ sắp xếp các mục theo thứ tự tăng dần theo mặc định. Bây giờ, cho rằng các đại diện số của một boolean là:

  • false = 0
  • true = 1

false giá trị tự nhiên sẽ đến đầu tiên. Nếu bạn muốn đảo ngược thứ tự chỉ cần sử dụng các từ khóa descending:

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

Trong C# booleans không có biểu diễn dạng số. Chúng không phải là những con số đằng sau hậu trường mà chúng ta giả vờ là những phép toán, chúng chỉ là những phép toán. Điều đó đã được nói rằng logic cũng có thể giúp mọi người nhớ cách thứ tự hoạt động (và cũng có thể là lý do tại sao thiết kế của .net là theo cách này) nhưng đáng nhớ rằng không có đại diện số của một bool trong .net. – Chris

+3

@Chris Nhưng có một kết quả dạng số nếu bạn đưa boolean vào một số nguyên. Mà vẫn còn nhiều hơn một số ngôn ngữ khác có. –

+0

Dòng 'int test = (int) true;' ném ngoại lệ trình biên dịch của 'Không thể chuyển đổi kiểu 'bool' thành 'int''. Làm thế nào bạn đúc mà không có một lỗi? – Chris

19

Về cơ bản, false sớm hơn true ... nghĩ về chúng là false = 0, true = 1. Điều này phù hợp với documentation for bool.CompareTo(bool).

Nếu bạn muốn ưu tiên các giá trị "đúng" khi bắt đầu, chỉ cần sử dụng OrderByDescending để thay thế.

6

Đặt hàng không phải là khoảng ưu tiên - khoảng giá trị thứ tự. Bạn đang thực hiện một thứ tự tăng dần so với giá trị boolean và false có giá trị thứ tự thấp hơn true trong ngữ cảnh đó.

3

Hãy để tôi giải thích điều này với một ví dụ về một List<bool>. Hãy xem xét các đoạn mã sau:

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

cuối cùng là opList sẽ có giá trị như false, false, true, true có nghĩa là sai đến trước khi chúng tôi áp dụng OrderBy qua một danh sách các giá trị boolean. Điều này là do sai được xem là 0 và đúng là 1.

Trong trường hợp của bạn, danh sách được sắp xếp đầu tiên là 5,1,9,3,4,2,6,8,7 dựa trên số orderby !numbersToFilterBy.Contains(data.Id) sau đó là data.Id sẽ cho bạn kết quả chính xác là 5, 1, 2, 3, 4, 6, 7, 8, 9.

Nếu bạn xóa ! khỏi số OrderBy, nó cung cấp cho bạn kết quả sắp xếp đầu tiên như 1,9,3,4,2,6,8,7,5 vì điều kiện là đúng cho 5 do đó nó sẽ đến cuối cùng trong thứ tự.

+1

Như tôi đã nói trên một câu trả lời sai là không bao giờ được coi là 0 và đúng 1. Nó có kết quả tương tự như nếu họ được nhưng thực sự chỉ là họ đã xác định một thứ tự trên hai giá trị boolean. Nó có thể được nitpicking nhưng cho thấy rằng khuôn khổ có thể được chuyển đổi bools để số nguyên là gây hiểu nhầm và không đơn giản hơn so với tuyên bố đúng rằng họ chỉ định nghĩa một thứ tự. Nó có thể giúp mọi người nhớ thứ tự nếu chúng được sử dụng cho các ngôn ngữ có chuyển đổi giữa bools và giá trị số của khóa học. – Chris