Klauzula orderby (odwołanie w C#)

W wyrażeniu zapytania klauzula orderby powoduje sortowanie zwracanej sekwencji lub podsekwencja (grupy) w kolejności rosnącej lub malejącej. Aby wykonać co najmniej jedną operację sortowania pomocniczego, można określić wiele kluczy. Sortowanie jest wykonywane przez domyślny porównujący typ elementu. Domyślna kolejność sortowania jest rosnąca. Można również określić niestandardowy moduł porównujący. Jest ona jednak dostępna tylko przy użyciu składni opartej na metodzie. Aby uzyskać więcej informacji, zobacz Sortowanie danych.

Przykład 1

W poniższym przykładzie pierwsze zapytanie sortuje wyrazy w kolejności alfabetycznej rozpoczynającej się od A, a drugie zapytanie sortuje te same wyrazy w kolejności malejącej. (Słowo kluczowe to domyślna ascending wartość sortowania i można pominąć).

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);
        }
    }
}
/* Output:
Ascending:
apple
blueberry
cherry

Descending:
cherry
blueberry
apple
*/

Przykład 2

Poniższy przykład wykonuje sortowanie podstawowe na nazwiskach uczniów, a następnie sortowanie pomocnicze na ich imionach.

class OrderbySample2
{
    // The element type of the data source.
    public class Student
    {
        public required string First { get; init; }
        public required string Last { get; init; }
        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);
            }
        }
    }
}
/* 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
*/

Uwagi

W czasie kompilacji klauzula orderby jest tłumaczona na wywołanie OrderBy metody . Wiele kluczy w klauzuli orderby przekłada się na ThenBy wywołania metod.

Zobacz też