Dot*_* NF 29 .net c# linq sorting operators
我正在研究一些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;}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况有什么解释?
Seb*_*ens 49
该排序依据方法对项目进行排序默认情况下按升序排列.现在,假设布尔值的数字表示为:
false = 0true = 1false价值自然会先到.如果您想要撤销订单,只需使用descending关键字:
var trueData = (from data in x
orderby numbersToFilterBy.Contains(data.Id) descending, data.Id
select data).ToList();
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 23
基本上,false早于true......将它们视为假= 0,真= 1.这与文档bool.CompareTo(bool)保持一致.
如果您想在开始时优先考虑"true"值,请OrderByDescending改用.
让我用一个List<bool>. 考虑以下片段:
List<bool> BoolList = new List<bool>() { true, false, false, true };
var opList = BoolList.OrderBy(x => x).ToList();
Run Code Online (Sandbox Code Playgroud)
最后,opList将具有false, false,值true,true这意味着当我们在布尔值列表上应用 OrderBy 时,首先出现 false。这是因为 false 被认为是,0而 true 将是1。
在您的情况下,列表首先5,1,9,3,4,2,6,8,7根据orderby !numbersToFilterBy.Contains(data.Id)then by进行排序,data.Id将为您提供准确的结果为5, 1, 2, 3, 4, 6, 7, 8, 9。
如果您!从OrderBy它中删除 ,它会为您提供第一个排序结果,1,9,3,4,2,6,8,7,5因为条件为真,5因此它将在排序中排在最后。