C# descending, ascending (Sort Query Expressions)

Use the descending and ascending keywords in query expressions. Learn about System.Linq.
Descending, ascending. A descending sort goes from high to low. For strings it goes from the last alphabetical string to the first.LINQSort
In a query expression, we use descending and ascending to indicate sort order. Ascending goes from low to high. These keywords encourage elegant and clear code.
Example. This program specifies a query expression (starting with from). The parts of query expressions that contain these keywords are query clauses.

Note: The rules by which these clauses are transformed into method calls are fairly clear to follow.

Next: The orderby clause here is translated into a method call to OrderByDescending.

OrderBy, OrderByDescending

Foreach: In the foreach-loop the query expression is evaluated and sorted. The int array elements are now ordered from largest to smallest.

C# program that uses descending keyword using System; using System.Linq; class Program { static void Main() { // // An integer array that is in an arbitrary order. // int[] array = { 1, 3, 5, 7, 9 }; // // Select the elements in a descending order with query clauses. // var result = from element in array orderby element descending select element; // // Evaluate the query and display the results. // foreach (var element in result) { Console.WriteLine(element); } } } Output 9 7 5 3 1
Contextual. The descending keyword is only considered a keyword in certain cases. The C# compiler provides a special-cased parser for query expressions.

Note: Query syntax was provided to allow for more natural syntax on declaration expressions.

Further: The descending contextual keyword here allows for a more natural language syntax for expressing the intent of the program.

Ascending. There is an ascending keyword that can be used in the same context as the descending keyword (following an orderby clause). Ascending sorts are normally the default.

So: You do not need to specify ascending to get an ascending sort. Query expression sorts are implicitly ascending.

However: The ascending keyword can provide a symmetry to the orderby clauses in your query expressions.


Program: We create an array of Employee objects. We use a query expression to sort these objects from high to low Salary.


Also: If two objects have the same Salary, they are again sorted from low to high Id.

C# program that uses ascending sort using System; using System.Linq; class Employee { public int Salary { get; set; } public int Id { get; set; } } class Program { static void Main() { Employee[] array = new Employee[] { new Employee(){Salary = 40000, Id = 4}, new Employee(){Salary = 40000, Id = 0}, new Employee(){Salary = 60000, Id = 7}, new Employee(){Salary = 60000, Id = 9} }; // Highest salaries first. // ... Lowest IDs first. var result = from em in array orderby em.Salary descending, em.Id ascending select em; foreach (var em in result) Console.WriteLine("{0}, {1}", em.Salary, em.Id); } } Output 60000, 7 60000, 9 40000, 0 40000, 4
Multiple properties. Query expressions provide an intuitive syntax for sorting on 2 properties at once. The first property specified in the orderby clause is the primary sort.

And: The second is the secondary sort that is only activated when a conflict occurs.

Some notes. Because ascending is the default sort order, you don't need to use it when you want to sort. You can just omit this keyword and the query expression will function the same way.

And: It is in a sense a form of syntactic sugar. It makes explicit the distinction between descending and ascending.

Internals. When we use IL Disassembler to peek inside the compiled code, we see it is translated into a query method called OrderByDescending. Queries are turned into method syntax.IL Disassembler

Note: The execution engine only sees the intermediate language provided by the C# compiler. It does not detect the original syntax.

A summary. Descending and ascending indicate the progression of an orderby clause in a query expression. The query clause is translated to method syntax before being executed.
© 2007-2019 Sam Allen. Every person is special and unique. Send bug reports to
Dot Net Perls