orderby 子句(C# 参考)orderby clause (C# Reference)

在查询表达式中,orderby 子句可导致返回的序列或子序列(组)以升序或降序排序。In a query expression, the orderby clause causes the returned sequence or subsequence (group) to be sorted in either ascending or descending order. 若要执行一个或多个次级排序操作,可以指定多个键。Multiple keys can be specified in order to perform one or more secondary sort operations. 元素类型的默认比较器执行排序。The sorting is performed by the default comparer for the type of the element. 默认排序顺序为升序。The default sort order is ascending. 还可以指定自定义比较器。You can also specify a custom comparer. 但是,只适用于使用基于方法的语法。However, it is only available by using method-based syntax. 有关详细信息,请参阅对数据进行排序For more information, see Sorting Data.

示例Example

在以下示例中,第一个查询按字母顺序从 A 开始对字词排序,而第二个查询则按降序对相同的字词排序。In the following example, the first query sorts the words in alphabetical order starting from A, and second query sorts the same words in descending order. ascending 关键字是默认排序值,可省略。)(The ascending keyword is the default sort value and can be omitted.)

class OrderbySample1
{
    static void Main()
    {            
        // Create a delicious data source.
        string[] fruits = { "cherry", "apple", "blueberry" };

        // Query for ascending sort.
        IEnumerable<string> sortAscendingQuery =
            from fruit in fruits
            orderby fruit //"ascending" is default
            select fruit;

        // Query for descending sort.
        IEnumerable<string> sortDescendingQuery =
            from w in fruits
            orderby w descending
            select w;            

        // Execute the query.
        Console.WriteLine("Ascending:");
        foreach (string s in sortAscendingQuery)
        {
            Console.WriteLine(s);
        }

        // Execute the query.
        Console.WriteLine(Environment.NewLine + "Descending:");
        foreach (string s in sortDescendingQuery)
        {
            Console.WriteLine(s);
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
Ascending:
apple
blueberry
cherry

Descending:
cherry
blueberry
apple
*/

示例Example

以下示例对学生的姓氏进行主要排序,然后对其名字进行次要排序。The following example performs a primary sort on the students' last names, and then a secondary sort on their first names.

class OrderbySample2
{
    // The element type of the data source.
    public class Student
    {
        public string First { get; set; }
        public string Last { get; set; }
        public int ID { get; set; }
    }

    public static List<Student> GetStudents()
    {
        // Use a collection initializer to create the data source. Note that each element
        //  in the list contains an inner sequence of scores.
        List<Student> students = new List<Student>
        {
           new Student {First="Svetlana", Last="Omelchenko", ID=111},
           new Student {First="Claire", Last="O'Donnell", ID=112},
           new Student {First="Sven", Last="Mortensen", ID=113},
           new Student {First="Cesar", Last="Garcia", ID=114},
           new Student {First="Debra", Last="Garcia", ID=115} 
        };

        return students;
    }
    static void Main(string[] args)
    {
        // Create the data source.
        List<Student> students = GetStudents();
        
        // Create the query.
        IEnumerable<Student> sortedStudents =
            from student in students
            orderby student.Last ascending, student.First ascending
            select student;

        // Execute the query.
        Console.WriteLine("sortedStudents:");
        foreach (Student student in sortedStudents)
            Console.WriteLine(student.Last + " " + student.First);           

        // Now create groups and sort the groups. The query first sorts the names
        // of all students so that they will be in alphabetical order after they are
        // grouped. The second orderby sorts the group keys in alpha order.            
        var sortedGroups =
            from student in students
            orderby student.Last, student.First
            group student by student.Last[0] into newGroup
            orderby newGroup.Key
            select newGroup;

        // Execute the query.
        Console.WriteLine(Environment.NewLine + "sortedGroups:");
        foreach (var studentGroup in sortedGroups)
        {
            Console.WriteLine(studentGroup.Key);
            foreach (var student in studentGroup)
            {
                Console.WriteLine("   {0}, {1}", student.Last, student.First);
            }
        }

        // Keep the console window open in debug mode
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:  
sortedStudents:
Garcia Cesar
Garcia Debra
Mortensen Sven
O'Donnell Claire
Omelchenko Svetlana

sortedGroups:
G
   Garcia, Cesar
   Garcia, Debra
M
   Mortensen, Sven
O
   O'Donnell, Claire
   Omelchenko, Svetlana
*/

备注Remarks

编译时,orderby 子句将转换为对 OrderBy 方法的调用。At compile time, the orderby clause is translated to a call to the OrderBy method. orderby 子句中的多个关键值将转换为 ThenBy 方法调用。Multiple keys in the orderby clause translate to ThenBy method calls.

请参阅See also