С# 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;}
}
}
Как объяснить, почему это происходит?
Ответы
Ответ 1
Метод OrderBy сортирует элементы по возрастанию по умолчанию. Теперь, учитывая, что числовое представление булева:
Значения 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
, поэтому оно будет последним в упорядочении.