A sorting operation orders the elements of a sequence based on one or more attributes. The first sort criterion performs a primary sort on the elements. By specifying a second sort criterion, you can sort the elements within each primary sort group.
author: BillWagner ms.author: wiwagn ms.topic: include ms.date: 05/29/2024
The following illustration shows the results of an alphabetical sort operation on a sequence of characters:

The standard query operator methods that sort data are listed in the following section.
Methods
| Method Name | Description | C# Query Expression Syntax | More Information |
|---|---|---|---|
| OrderBy | Sorts values in ascending order. | orderby |
System.Linq.Enumerable.OrderBy System.Linq.Queryable.OrderBy |
| OrderByDescending | Sorts values in descending order. | orderby … descending |
System.Linq.Enumerable.OrderByDescending System.Linq.Queryable.OrderByDescending |
| ThenBy | Performs a secondary sort in ascending order. | orderby …, … |
System.Linq.Enumerable.ThenBy System.Linq.Queryable.ThenBy |
| ThenByDescending | Performs a secondary sort in descending order. | orderby …, … descending |
System.Linq.Enumerable.ThenByDescending System.Linq.Queryable.ThenByDescending |
| Reverse | Reverses the order of the elements in a collection. | Not applicable. | System.Linq.Enumerable.Reverse System.Linq.Queryable.Reverse |
author: BillWagner ms.author: wiwagn ms.topic: include ms.date: 10/04/2024
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/DataSources.csQueryDataSource
namespace StandardQueryOperators;
//<QueryDataSource>
public enum GradeLevel
{
FirstYear = 1,
SecondYear,
ThirdYear,
FourthYear
};
public class Student
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
public required int ID { get; init; }
public required GradeLevel Year { get; init; }
public required List<int> Scores { get; init; }
public required int DepartmentID { get; init; }
}
public class Teacher
{
public required string First { get; init; }
public required string Last { get; init; }
public required int ID { get; init; }
public required string City { get; init; }
}
public class Department
{
public required string Name { get; init; }
public int ID { get; init; }
public required int TeacherID { get; init; }
}
// </QueryDataSource>
public static class Sources
{
public static IEnumerable<Department> Departments =>
[
new() { Name = "English", ID = 1, TeacherID = 901 },
new() { Name = "Mathematics", ID = 2, TeacherID = 965 },
new() { Name = "Engineering", ID = 3, TeacherID = 932 },
new() { Name = "Economics", ID = 4, TeacherID = 945 },
new() { Name = "Physics", ID = 5, TeacherID = 987 },
new() { Name = "Chemistry", ID = 6, TeacherID = 901 }
];
// Create a data source by using a collection initializer.
public static IEnumerable<Student> Students =>
[
new() { FirstName = "Svetlana", LastName = "Omelchenko", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 111, Scores = [97, 90, 73, 54] },
new() { FirstName = "Claire", LastName = "O'Donnell", DepartmentID = -1, Year = GradeLevel.FirstYear, ID = 112, Scores = [56, 78, 95, 95] },
new() { FirstName = "Sven", LastName = "Mortensen", DepartmentID = 3, Year = GradeLevel.SecondYear, ID = 113, Scores = [61, 52, 48, 72] },
new() { FirstName = "Cesar", LastName = "Garcia", DepartmentID = 4, Year = GradeLevel.SecondYear, ID = 114, Scores = [71, 86, 77, 97] },
new() { FirstName = "Debra", LastName = "Garcia", DepartmentID = 5, Year = GradeLevel.ThirdYear, ID = 115, Scores = [66, 96, 70, 69] },
new() { FirstName = "Fadi", LastName = "Fakhouri", DepartmentID = 6, Year = GradeLevel.ThirdYear, ID = 116, Scores = [93, 72, 62, 65] },
new() { FirstName = "Hanying", LastName = "Feng", DepartmentID = 1, Year = GradeLevel.FourthYear, ID = 117, Scores = [53, 81, 81, 50] },
new() { FirstName = "Hugo", LastName = "Garcia", DepartmentID = 2, Year = GradeLevel.FourthYear, ID = 118, Scores = [68, 91, 60, 51] },
new() { FirstName = "Lance", LastName = "Tucker", DepartmentID = -1, Year = GradeLevel.FirstYear, ID = 119, Scores = [83, 42, 68, 63] },
new() { FirstName = "Terry", LastName = "Adams", DepartmentID = 4, Year = GradeLevel.SecondYear, ID = 120, Scores = [63, 91, 71, 51] },
new() { FirstName = "Eugene", LastName = "Zabokritski", DepartmentID = 5, Year = GradeLevel.ThirdYear, ID = 121, Scores = [56, 40, 73, 75] },
new() { FirstName = "Michael", LastName = "Tucker", DepartmentID = 3, Year = GradeLevel.FourthYear, ID = 122, Scores = [85, 82, 81, 70] },
new() { FirstName = "Mark", LastName = "Johansson", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 123, Scores = [82, 94, 84, 65] },
new() { FirstName = "Sarah", LastName = "Andersson", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 124, Scores = [77, 83, 67, 90] },
new() { FirstName = "Christiane", LastName = "Jensen", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 125, Scores = [88, 57, 65, 87] },
new() { FirstName = "Evgeniya", LastName = "Maslova", DepartmentID = 2, Year = GradeLevel.SecondYear, ID = 126, Scores = [46, 84, 87, 66] },
new() { FirstName = "Innocenty", LastName = "Popov", DepartmentID = 6, Year = GradeLevel.SecondYear, ID = 127, Scores = [92, 45, 88, 60] },
new() { FirstName = "Anna", LastName = "Hedlund", DepartmentID = 2, Year = GradeLevel.SecondYear, ID = 128, Scores = [85, 54, 74, 75] },
new() { FirstName = "Erik", LastName = "Axelsson", DepartmentID = 3, Year = GradeLevel.ThirdYear, ID = 129, Scores = [51, 78, 54, 49] },
new() { FirstName = "Anna", LastName = "Yermolayeva", DepartmentID = 3, Year = GradeLevel.ThirdYear, ID = 130, Scores = [46, 73, 93, 68] },
new() { FirstName = "Cassie", LastName = "Hicks", DepartmentID = 3, Year = GradeLevel.ThirdYear, ID = 131, Scores = [85, 60, 85, 56] },
new() { FirstName = "Ifeanacho", LastName = "Jamuike", DepartmentID = 4, Year = GradeLevel.FourthYear, ID = 132, Scores = [54, 98, 56, 61] },
new() { FirstName = "Carmen", LastName = "Vella", DepartmentID = 6, Year = GradeLevel.FourthYear, ID = 133, Scores = [63, 57, 69, 70] },
new() { FirstName = "Noel", LastName = "Svensson", DepartmentID = 4, Year = GradeLevel.FourthYear, ID = 134, Scores = [85, 60, 80, 73] },
new() { FirstName = "Sanna", LastName = "Hansson", DepartmentID = 5, Year = GradeLevel.FirstYear, ID = 135, Scores = [46, 94, 93, 45] },
new() { FirstName = "Sofiya", LastName = "Seleznyova", DepartmentID = 6, Year = GradeLevel.FirstYear, ID = 136, Scores = [74, 45, 87, 55] },
new() { FirstName = "Amy E.", LastName = "Edwards", DepartmentID = 5, Year = GradeLevel.FirstYear, ID = 137, Scores = [87, 59, 55, 70] },
new() { FirstName = "Nancy", LastName = "Engström", DepartmentID = 3, Year = GradeLevel.FirstYear, ID = 138, Scores = [75, 73, 78, 83] },
new() { FirstName = "Katerina", LastName = "Kovaleva", DepartmentID = 2, Year = GradeLevel.FirstYear, ID = 139, Scores = [44, 50, 47, 41] },
new() { FirstName = "Ifunanya", LastName = "Ugomma", DepartmentID = 4, Year = GradeLevel.FirstYear, ID = 140, Scores = [84, 82, 96, 80] },
new() { FirstName = "Don", LastName = "Richardson", DepartmentID = 5, Year = GradeLevel.FirstYear, ID = 141, Scores = [47, 91, 73, 68] },
new() { FirstName = "Josephine", LastName = "Balzan", DepartmentID = 6, Year = GradeLevel.SecondYear, ID = 142, Scores = [40, 47, 63, 42] },
new() { FirstName = "Michelle", LastName = "Caruana", DepartmentID = -1, Year = GradeLevel.FirstYear, ID = 143, Scores = [97, 92, 69, 77] },
new() { FirstName = "Gaby", LastName = "Frost", DepartmentID = 2, Year = GradeLevel.FirstYear, ID = 144, Scores = [70, 79, 47, 79] },
new() { FirstName = "Erna", LastName = "Nilsson", DepartmentID = 3, Year = GradeLevel.FirstYear, ID = 145, Scores = [56, 52, 51, 51] },
new() { FirstName = "Naima", LastName = "Larsson", DepartmentID = 4, Year = GradeLevel.ThirdYear, ID = 146, Scores = [65, 81, 44, 61] },
new() { FirstName = "Donald", LastName = "Urquhart", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 147, Scores = [92, 90, 95, 57] },
new() { FirstName = "Nadezhda", LastName = "Kolpakova", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 148, Scores = [94, 69, 52, 58] },
new() { FirstName = "Ruth", LastName = "Olsson", DepartmentID = 2, Year = GradeLevel.FourthYear, ID = 149, Scores = [66, 49, 82, 74] },
new() { FirstName = "Maria", LastName = "Sammut", DepartmentID = 2, Year = GradeLevel.FirstYear, ID = 150, Scores = [43, 83, 94, 60] },
new() { FirstName = "Veronika", LastName = "Berg", DepartmentID = 3, Year = GradeLevel.FirstYear, ID = 151, Scores = [59, 76, 65, 92] },
new() { FirstName = "Nicholas", LastName = "Micallef", DepartmentID = 3, Year = GradeLevel.FirstYear, ID = 152, Scores = [44, 57, 52, 63] },
new() { FirstName = "Izuchukwu", LastName = "Adaobi", DepartmentID = 4, Year = GradeLevel.SecondYear, ID = 153, Scores = [51, 40, 42, 54] },
new() { FirstName = "Nwanneka", LastName = "Ifeoma", DepartmentID = 4, Year = GradeLevel.FirstYear, ID = 154, Scores = [44, 70, 98, 56] },
new() { FirstName = "John", LastName = "Falzon", DepartmentID = 5, Year = GradeLevel.FirstYear, ID = 155, Scores = [77, 65, 83, 45] },
new() { FirstName = "Martina", LastName = "Mattsson", DepartmentID = 5, Year = GradeLevel.ThirdYear, ID = 156, Scores = [51, 49, 96, 72] },
new() { FirstName = "Jeanette", LastName = "Berggren", DepartmentID = 4, Year = GradeLevel.FirstYear, ID = 157, Scores = [41, 67, 46, 68] },
new() { FirstName = "Anastasiya", LastName = "Sazonova", DepartmentID = 2, Year = GradeLevel.FirstYear, ID = 158, Scores = [53, 96, 76, 49] },
new() { FirstName = "Bruce", LastName = "Keever", DepartmentID = 3, Year = GradeLevel.FirstYear, ID = 159, Scores = [54, 81, 84, 81] },
new() { FirstName = "Sami", LastName = "Åkesson", DepartmentID = 5, Year = GradeLevel.FourthYear, ID = 160, Scores = [45, 85, 79, 94] },
new() { FirstName = "Jesper", LastName = "Jakobsson", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 161, Scores = [59, 98, 47, 92] },
new() { FirstName = "Max", LastName = "Lindgren", DepartmentID = 2, Year = GradeLevel.FirstYear, ID = 162, Scores = [86, 88, 96, 63] },
new() { FirstName = "Arina", LastName = "Ivanova", DepartmentID = 1, Year = GradeLevel.FirstYear, ID = 163, Scores = [93, 63, 70, 80] }
];
public static IEnumerable<Teacher> Teachers =>
[
new() { First = "Ann", Last = "Beebe", ID = 901, City = "Seattle" },
new() { First = "Alex", Last = "Robinson", ID = 910, City = "Redmond" },
new() { First = "Michiyo", Last = "Sato", ID = 921, City = "Tacoma" },
new() { First = "Aylin", Last = "Lundgren", ID = 932, City = "Seattle" },
new() { First = "Gleb", Last = "Seleznyov", ID = 943, City = "Redmond" },
new() { First = "Alexandra", Last = "Voronova", ID = 954, City = "Tacoma" },
new() { First = "Kevin", Last = "McDowell", ID = 965, City = "Redmond" },
new() { First = "Selma", Last = "Nyberg", ID = 976, City = "Seattle" },
new() { First = "Selma", Last = "Åstrom", ID = 987, City = "Redmond" },
new() { First = "Hillevi", Last = "Bengtsson", ID = 998, City = "Tacoma" },
new() { First = "Allan", Last = "Sandberg", ID = 912, City = "Seattle" },
new() { First = "Dmitry", Last = "Degtyarev", ID = 923, City = "Redmond" },
new() { First = "Arinze", Last = "Madu", ID = 934, City = "Seattle" },
new() { First = "Andrey", Last = "Glazkov", ID = 945, City = "Redmond" },
new() { First = "Kettil", Last = "Berggren", ID = 956, City = "Tacoma" },
new() { First = "Hanying", Last = "Feng", ID = 967, City = "Seattle" },
new() { First = "Hugo", Last = "Garcia", ID = 978, City = "Redmond" },
new() { First = "Michael", Last = "Tucker", ID = 989, City = "Tacoma" },
new() { First = "Ifeanacho", Last = "Jamuike", ID = 991, City = "Redmond" },
new() { First = "Carmen", Last = "Vella", ID = 982, City = "Tacoma" },
new() { First = "Noel", Last = "Svensson", ID = 973, City = "Seattle" }
];
}author: '' ms.author: '' ms.topic: include ms.date: 08/11/2025
Primary Ascending Sort
The following example demonstrates how to use the orderby clause in a LINQ query to sort the array of teachers by family name, in ascending order.
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csPrimaryAscendingSortQuery
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}The equivalent query written using method syntax is shown in the following code:
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csPrimaryAscendingSortMethod
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}Primary Descending Sort
The next example demonstrates how to use the orderby descending clause in a LINQ query to sort the teachers by family name, in descending order.
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csPrimaryDescendingSortQuery
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}The equivalent query written using method syntax is shown in the following code:
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csPrimaryDescendingSortMethod
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}Secondary Ascending Sort
The following example demonstrates how to use the orderby clause in a LINQ query to perform a primary and secondary sort. The teachers are sorted primarily by city and secondarily by their family name, both in ascending order.
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csSecondaryAscendingSortQuery
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}The equivalent query written using method syntax is shown in the following code:
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csSecondaryAscendingSortMethod
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}Secondary Descending Sort
The next example demonstrates how to use the orderby descending clause in a LINQ query to perform a primary sort, in ascending order, and a secondary sort, in descending order. The teachers are sorted primarily by city and secondarily by their family name.
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csSecondaryDescendingSortQuery
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}The equivalent query written using method syntax is shown in the following code:
sample · csharpdocs/csharp/linq/standard-query-operators/snippets/standard-query-operators/SortExamples.csSecondaryDescendingSortMethod
using System.Collections.Generic;
namespace StandardQueryOperators;
internal class SortExamples
{
private static readonly IEnumerable<Teacher> teachers = Sources.Teachers;
public static void RunAllSnippets()
{
Console.WriteLine("Ascending Query");
AscendingSortQuerySyntax();
Console.WriteLine("Ascending Method");
AscendingSortMethodSyntax();
Console.WriteLine("Descending Query");
DescendingSortQuerySyntax();
Console.WriteLine("Descending Method");
DescendingSortMethodSyntax();
Console.WriteLine("Ascending Secondary Query");
SecondaryAscendingSortQuerySyntax();
Console.WriteLine("Ascending Secondary Method");
SecondaryAscendingSortMethodSyntax();
Console.WriteLine("Descending Secondary Query");
SecondaryDescendingSortQuerySyntax();
Console.WriteLine("Descending Secondary Method");
SecondaryDescendingSortMethodSyntax();
}
private static void AscendingSortQuerySyntax()
{
// <PrimaryAscendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortQuery>
}
private static void AscendingSortMethodSyntax()
{
// <PrimaryAscendingSortMethod>
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryAscendingSortMethod>
}
private static void DescendingSortQuerySyntax()
{
// <PrimaryDescendingSortQuery>
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortQuery>
}
private static void DescendingSortMethodSyntax()
{
// <PrimaryDescendingSortMethod>
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
// </PrimaryDescendingSortMethod>
}
private static void SecondaryAscendingSortQuerySyntax()
{
// <SecondaryAscendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortQuery>
}
private static void SecondaryAscendingSortMethodSyntax()
{
// <SecondaryAscendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryAscendingSortMethod>
}
private static void SecondaryDescendingSortQuerySyntax()
{
// <SecondaryDescendingSortQuery>
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortQuery>
}
private static void SecondaryDescendingSortMethodSyntax()
{
// <SecondaryDescendingSortMethod>
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
// </SecondaryDescendingSortMethod>
}
}