C# LINQ Order
last modified January 23, 2024
In this article we shows how to sort data in C# with LINQ queries.
Language-Integrated Query (LINQ) is a domain-specific language for querying data from various data sources, including arrays, lists, XML files, or databases.
We can use LINQ's Order, OrderDescending,
OrderBy, and OrderByDescending methods to order data.
The methods do not mutate the original sequence; they return a new sorted
sequence.
In addition, we can use the orderby, ascending, and
descending clauses with LINQ query expressions.
C# LINQ Order
The Order method sorts the elements of a sequence in ascending
order.
Order<T>(IEnumerable<T>) Order<T>(IEnumerable<T>, IComparer<T>)
The second method accepts an IComparer.
List<string> words = [
"world", "War", "abbot", "Caesar", "castle", "sky", "den",
"forest", "ocean", "water", "falcon", "owl", "rain", "Earth"
];
var sorted = words.Order().ToList();
sorted.ForEach(Console.WriteLine);
Console.WriteLine("-------------------------");
var sorted2 = words.Order(StringComparer.Ordinal).ToList();
sorted2.ForEach(Console.WriteLine);
We have a list of words. We sort the words in ascending order.
var sorted = words.Order().ToList(); sorted.ForEach(Console.WriteLine);
We sort the words with Order and print the sorted result to the
console. The words are sorted in a case insensitive manner.
var sorted2 = words.Order(StringComparer.Ordinal).ToList(); sorted2.ForEach(Console.WriteLine);
To the overloaded method we also pass a string comparer. The
StringComparer.Ordinal causes the words to be sorted in a
case-sensitive manner.
$ dotnet run abbot Caesar castle den Earth falcon forest ocean owl rain sky War water world ------------------------- Caesar Earth War abbot castle den falcon forest ocean owl rain sky water world
C# LINQ OrderDescending
The OrderDescending method sorts the elements of a sequence in
descending order.
List<int> vals = [0, -2, 1, -3, 4, 3, 2, 5, 7, -1];
var sorted = vals.OrderDescending();
Console.WriteLine(string.Join(", ", sorted));
In the program, we sort the integers in descending order.
$ dotnet run 7, 5, 4, 3, 2, 1, 0, -1, -2, -3
C# LINQ OrderBy
The OrderBy method sorts the elements of a sequence in ascending
order according to a key.
OrderBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)
The method accepts a keyselector function, which extracts a key from an element.
List<User> users =
[
new ("John", "Doe", 1230),
new ("Lucy", "Novak", 670),
new ("Ben", "Walter", 2050),
new ("Robin", "Brown", 2300),
new ("Amy", "Doe", 1250),
new ("Joe", "Draker", 1190),
new ("Janet", "Doe", 980),
new ("Albert", "Novak", 1930),
];
Console.WriteLine("sort ascending by last name and salary");
var sortedUsers = users.OrderBy(u => u.LastName).ThenBy(u => u.Salary);
foreach (var user in sortedUsers)
{
Console.WriteLine(user);
}
record User(string FirstName, string LastName, int Salary);
In the example, we sort the users first by their last names, then by their salaries.
var sortedUsers = users.OrderBy(u => u.LastName).ThenBy(u => u.Salary);
We sort the users by their last names and then by their salaries in ascending
order. The keyselector function in the form of a lambda extracts the
LastName attribute to be the sort key.
$ dotnet run
sort ascending by last name and salary
User { FirstName = Robin, LastName = Brown, Salary = 2300 }
User { FirstName = Janet, LastName = Doe, Salary = 980 }
User { FirstName = John, LastName = Doe, Salary = 1230 }
User { FirstName = Amy, LastName = Doe, Salary = 1250 }
User { FirstName = Joe, LastName = Draker, Salary = 1190 }
User { FirstName = Lucy, LastName = Novak, Salary = 670 }
User { FirstName = Albert, LastName = Novak, Salary = 1930 }
User { FirstName = Ben, LastName = Walter, Salary = 2050 }
C# LINQ OrderByDescending
The OrderByDescending method sorts the elements of a sequence in
descending order.
List<User> users =
[
new ("John", "Doe", 1230),
new ("Lucy", "Novak", 670),
new ("Ben", "Walter", 2050),
new ("Robin", "Brown", 2300),
new ("Amy", "Doe", 1250),
new ("Joe", "Draker", 1190),
new ("Janet", "Doe", 980),
new ("Albert", "Novak", 1930),
];
Console.WriteLine("sort descending by last name and salary");
var sortedUsers = users.OrderByDescending(u => u.LastName)
.ThenByDescending(u => u.Salary);
foreach (var user in sortedUsers)
{
Console.WriteLine(user);
}
record User(string FirstName, string LastName, int Salary);
In the program, we sort the users by last name and then by salary in descending order.
$ dotnet run
sort descending by last name and salary
User { FirstName = Ben, LastName = Walter, Salary = 2050 }
User { FirstName = Albert, LastName = Novak, Salary = 1930 }
User { FirstName = Lucy, LastName = Novak, Salary = 670 }
User { FirstName = Joe, LastName = Draker, Salary = 1190 }
User { FirstName = Amy, LastName = Doe, Salary = 1250 }
User { FirstName = John, LastName = Doe, Salary = 1230 }
User { FirstName = Janet, LastName = Doe, Salary = 980 }
User { FirstName = Robin, LastName = Brown, Salary = 2300 }
Ordering with query expressions
The next example uses the LINQ query expressions to sort data.
List<string> words = [
"world", "War", "abbot", "Caesar", "castle", "sky", "den",
"forest", "ocean", "water", "falcon", "owl", "rain", "Earth"
];
var sorted = from word in words
orderby word
select word;
Console.WriteLine(string.Join(", ", sorted));
var sorted2 = from word in words
orderby word descending
select word;
Console.WriteLine(string.Join(", ", sorted2));
We sort a list of words with orderby and descending
clauses.
$ dotnet run abbot, Caesar, castle, den, Earth, falcon, forest, ocean, owl, rain, sky, War, water, world world, water, War, sky, rain, owl, ocean, forest, falcon, Earth, den, castle, Caesar, abbot
Join and order
In the next example, we perform ordering operation on a join operation.
List<Country> countries =
[
new("Slovakia", 1),
new("Hungary", 2),
new("Russia", 3),
new("Poland", 4)
];
List<City> cities =
[
new("Bratislava", 1),
new("Poprad", 1),
new("Trnava", 1),
new("Budapest", 2),
new("Miskolc", 2),
new("Ajka", 2),
new("Moscow", 3),
new("Jakutsk", 3),
new("Perm", 3),
new("Omsk", 3),
new("Warsaw", 4),
new("Krakow", 4),
];
var groups =
from country in countries
join city in cities on country.Id equals city.CountryId into cGroup
orderby country.Name
select new
{
Country = country.Name,
Cities =
from city2 in cGroup
orderby city2.Name
select city2
};
foreach (var group in groups)
{
Console.WriteLine(group.Country);
foreach (var city in group.Cities)
{
Console.WriteLine($" {city.Name}");
}
}
record City(string Name, int CountryId);
record Country(string Name, int Id);
We have countries and their corresponding cities. We join the cities with their countries. We output the cities in ascending order and cities inside countries also in ascending order.
var groups =
from country in countries
join city in cities on country.Id equals city.CountryId into cGroup
orderby country.Name
select new
{
Country = country.Name,
Cities =
from city2 in cGroup
orderby city2.Name
select city2
};
We join the cities with their countries. The key is the country Id. We order
the countries and the cities with orderby.
foreach (var group in groups)
{
Console.WriteLine(group.Country);
foreach (var city in group.Cities)
{
Console.WriteLine($" {city.Name}");
}
}
We go over the groups and print each country with its cities.
$ dotnet run
Hungary
Ajka
Budapest
Miskolc
Poland
Krakow
Warsaw
Russia
Jakutsk
Moscow
Omsk
Perm
Slovakia
Bratislava
Poprad
Trnava
Source
In this article we have ordered data in C# with LINQ.
Author
List all C# tutorials.