Подтвердить что ты не робот

С# LINQ Orderby - Как влияет true/false на orderby?

Я изучал порядок упорядочения LINQ, поскольку у меня есть список идентификаторов, и мне нужно упорядочивать их последовательно. Однако существуют определенные идентификаторы, которые должны иметь приоритет над стандартным порядком.

Учитывая этот код С# (который можно вставить в .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;}
  }
}

Как объяснить, почему это происходит?

4b9b3361

Ответ 1

Метод OrderBy сортирует элементы по возрастанию по умолчанию. Теперь, учитывая, что числовое представление булева:

  • false= 0
  • true= 1
Значения

false, естественно, будут первыми. Если вы хотите изменить порядок, просто используйте ключевое слово descending:

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

Ответ 2

В принципе, false раньше true... думает о них как false = 0, true = 1. Это соответствует документации для bool.CompareTo(bool).

Если вы хотите определить приоритеты "истинные" для начала, просто используйте OrderByDescending.

Ответ 3

Заказ не относится к приоритету - это порядковое значение. Вы выполняете восходящий порядок против логического значения, а false имеет более низкое порядковое значение, чем true в этом контексте.

Ответ 4

Позвольте мне объяснить это на примере List<bool>. Рассмотрим следующий фрагмент:

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

Наконец, opList будет иметь значения как false, false, true, true, что означает, что false появляется первым, когда мы применяем OrderBy над списком логических значений. Это потому, что false считается 0, а true будет 1.

В вашем случае список сначала сортируется как 5,1,9,3,4,2,6,8,7 на основе orderby !numbersToFilterBy.Contains(data.Id), а затем data.Id даст вам точный результат как 5, 1, 2, 3, 4, 6, 7, 8, 9.

Если вы удалите ! из OrderBy, он даст вам первый результат сортировки, такой как 1,9,3,4,2,6,8,7,5, поскольку условие истинно для 5, поэтому оно будет последним в упорядочении.