Verileri Sıralama (C#)

Sıralama işlemi, bir dizinin öğelerini bir veya daha fazla öznitelik temelinde sıralar. İlk sıralama ölçütü, öğeler üzerinde birincil sıralama gerçekleştirir. İkinci bir sıralama ölçütü belirterek, her birincil sıralama grubundaki öğeleri sıralayabilirsiniz.

Önemli

Bu örnekler bir System.Collections.Generic.IEnumerable<T> veri kaynağı kullanır. Veri kaynaklarını ve ifade ağaçlarını System.Linq.IQueryProviderkullanan System.Linq.IQueryable<T> veri kaynakları. İfade ağaçlarının izin verilen C# söz diziminde sınırlamaları vardır. Ayrıca EF Core gibi her IQueryProvider veri kaynağı daha fazla kısıtlama uygulayabilir. Veri kaynağınızın belgelerine bakın.

Aşağıdaki çizimde, bir karakter dizisinde alfabetik sıralama işleminin sonuçları gösterilmektedir:

Alfabetik sıralama işlemini gösteren grafik.

Verileri sıralayan standart sorgu işleci yöntemleri aşağıdaki bölümde listelenmiştir.

Yöntemler

Yöntem Adı Açıklama C# Sorgu İfadesi Söz Dizimi Daha Fazla Bilgi
OrderBy Değerleri artan düzende sıralar. orderby Enumerable.OrderBy

Queryable.OrderBy
OrderByDescending Değerleri azalan düzende sıralar. orderby … descending Enumerable.OrderByDescending

Queryable.OrderByDescending
SonraDan İkincil sıralamayı artan düzende gerçekleştirir. orderby …, … Enumerable.ThenBy

Queryable.ThenBy
ThenByDescending İkincil sıralamayı azalan düzende gerçekleştirir. orderby …, … descending Enumerable.ThenByDescending

Queryable.ThenByDescending
Ters kaydet Koleksiyondaki öğelerin sırasını tersine çevirir. Uygulanamaz. Enumerable.Reverse

Queryable.Reverse

Not

Bu makaledeki aşağıdaki örneklerde bu alan için ortak veri kaynakları kullanılır.
Her Student birinin bir not düzeyi, bir birincil bölüm ve bir dizi puanı vardır. Ayrıca, Teacher öğretmenin ders aldığı kampüsü tanımlayan bir City özelliği de vardır. A'nın Department bir adı ve bölüm başkanı olarak görev yapan bir Teacher kişi için bir referansı vardır.
Örnek veri kümesini kaynak depoda bulabilirsiniz.

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; }
}

Birincil Artan Sıralama

Aşağıdaki örnekte, öğretmen dizisini orderby aile adına göre artan düzende sıralamak için LINQ sorgusunda yan tümcesinin nasıl kullanılacağı gösterilmektedir.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

Yöntem söz dizimi kullanılarak yazılan eşdeğer sorgu aşağıdaki kodda gösterilir:

IEnumerable<string> query = teachers
    .OrderBy(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

Birincil Azalan Sıralama

Sonraki örnekte, öğretmenleri aile adına göre azalan düzende sıralamak için LINQ sorgusundaki yan tümcesinin nasıl kullanılacağı orderby descending gösterilmektedir.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last descending
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

Yöntem söz dizimi kullanılarak yazılan eşdeğer sorgu aşağıdaki kodda gösterilir:

IEnumerable<string> query = teachers
    .OrderByDescending(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

İkincil Artan Sıralama

Aşağıdaki örnekte, birincil ve ikincil sıralama gerçekleştirmek için LINQ sorgusunda yan tümcesinin orderby nasıl kullanılacağı gösterilmektedir. Öğretmenler, her ikisi de artan düzende öncelikle şehre ve ikincil olarak aile adlarına göre sıralanır.

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}");
}

Yöntem söz dizimi kullanılarak yazılan eşdeğer sorgu aşağıdaki kodda gösterilir:

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}");
}

İkincil Azalan Sıralama

Sonraki örnekte, linq sorgusundaki yan tümcesinin orderby descending artan düzende ve ikincil sıralamayı azalan düzende gerçekleştirmek için nasıl kullanılacağı gösterilmektedir. Öğretmenler öncelikle şehre ve ikincil olarak aile adlarına göre sıralanır.

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}");
}

Yöntem söz dizimi kullanılarak yazılan eşdeğer sorgu aşağıdaki kodda gösterilir:

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}");
}

Ayrıca bkz.