Enumerable.OrderBy() / OrderByDescending()
A LINQ extension method that sorts the elements of a sequence in ascending or descending order. This article also covers ThenBy(), which lets you sort by multiple keys.
Syntax
using System.Linq;
// Sort in ascending order.
IOrderedEnumerable<T> asc = source.OrderBy(x => key);
// Sort in descending order.
IOrderedEnumerable<T> desc = source.OrderByDescending(x => key);
// Add a second and third sort key (chain after OrderBy).
IOrderedEnumerable<T> multi = source.OrderBy(x => key1)
.ThenBy(x => key2)
.ThenByDescending(x => key3);
Method List
| Method | Description |
|---|---|
| OrderBy(keySelector) | Sorts elements in ascending order by the specified key. |
| OrderByDescending(keySelector) | Sorts elements in descending order by the specified key. |
| ThenBy(keySelector) | When the preceding sort has ties, sorts those elements in ascending order by an additional key. |
| ThenByDescending(keySelector) | When the preceding sort has ties, sorts those elements in descending order by an additional key. |
| Reverse() | Reverses the order of elements in the sequence (this is not a sort). |
Sample Code
using System;
using System.Collections.Generic;
using System.Linq;
List<int> numbers = new List<int> { 5, 1, 8, 3, 9, 2 };
// Sort in ascending order.
IEnumerable<int> asc = numbers.OrderBy(n => n);
Console.WriteLine(string.Join(", ", asc)); // 1, 2, 3, 5, 8, 9
// Sort in descending order.
IEnumerable<int> desc = numbers.OrderByDescending(n => n);
Console.WriteLine(string.Join(", ", desc)); // 9, 8, 5, 3, 2, 1
// Sort a list of objects by a property.
var people = new List<(string Name, int Age)>
{
("Tanaka", 30),
("Suzuki", 25),
("Sato", 30),
("Yamada", 20),
};
// Sort by age in ascending order.
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge)
Console.WriteLine($"{p.Name}: {p.Age}");
// Sort by age ascending; break ties by name ascending.
var byAgeAndName = people.OrderBy(p => p.Age)
.ThenBy(p => p.Name);
foreach (var p in byAgeAndName)
Console.WriteLine($"{p.Name}: {p.Age}");
// Sort strings by length descending; break ties alphabetically.
List<string> fruits = new List<string> { "fig", "apple", "banana", "kiwi", "plum" };
var sorted = fruits.OrderByDescending(f => f.Length).ThenBy(f => f);
Console.WriteLine(string.Join(", ", sorted)); // banana, apple, kiwi, plum, fig
Notes
The OrderBy() family of methods performs a stable sort. This means elements that share the same key value retain their original relative order.
Chaining another OrderBy() call after an existing OrderBy() discards the previous sort. Always use ThenBy() when you need to sort by multiple keys. Also, sorting returns a new sequence and does not modify the original collection.
To retrieve the first or last element after sorting, see Enumerable.First() / Last(). To sort within groups, combine this method with Enumerable.GroupBy().
If you find any errors or copyright issues, please contact us.