DotNet NF DotNet NF - 1 month ago 10x
C# Question

C# LINQ Orderby - How does true/false affect orderby?

I was studying a bit of LINQ ordering as I have a list of Ids, and I need to order them sequentially. However, there are certain ids that need to take precedence over the standard ordering.

Given this C# code (which can be pasted into .NET Fiddle to test) the ordering works as I need it to, but I don't understand why a not (

) operator on a contains is giving me the correct ordering?

My expected ordering output is (
5, 1, 2, 3, 4, 6, 7, 8, 9

If I have a
in my ordering, shouldn't it give ordering priority to the rows that returned true? Instead it appears to give ordering priority to rows that return 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){

public class XClass{
public int Id{get;set;}

What is the explanation as to why this happens?


The OrderBy method will sort items in ascending order by default. Now, given that the numeric representation of a boolean is:

  • false = 0
  • true = 1

false values will naturally come first. If you want to reverse the order just use the descending keyword:

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