Accepted answer

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();


Let me explain this with an example of a List<bool>. Consider the following snippet:

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

finally the opList will have the values as false,false,true,true which means false come first when we apply OrderBy over a list of boolean values. This is because false is consider as 0 and true will be 1.

In your case the list is first sorted as 5,1,9,3,4,2,6,8,7 based on the orderby !numbersToFilterBy.Contains(data.Id) then by data.Id will gives you the exact result as 5, 1, 2, 3, 4, 6, 7, 8, 9.

If you remove the ! from the OrderBy it gives you the first sort result like 1,9,3,4,2,6,8,7,5 since the condition is true for 5 hence it will come last in the ordering.


Ordering isn't about priority – it's about ordinal value. You're doing an ascending order against a boolean value, and false has a lower ordinal value than true in that context.


Basically, false is earlier than true... think of them as false=0, true=1. This is in-keeping with the documentation for bool.CompareTo(bool).

If you want to prioritize "true" values to the start, just use OrderByDescending instead.

Related Query

More Query from same tag