데이터 정렬(C#)

정렬 작업은 하나 이상의 특성을 기준으로 시퀀스의 요소를 정렬합니다. 첫 번째 정렬 기준은 요소에 대해 기본 정렬을 수행합니다. 두 번째 정렬 기준을 지정하면 각 기본 정렬 그룹 내의 요소를 정렬할 수 있습니다.

다음 그림은 문자 시퀀스에 대한 사전순 정렬 작업의 결과를 보여 줍니다.

사전순 정렬 작업을 보여 주는 그래픽입니다.

다음 섹션에는 데이터를 정렬하는 표준 쿼리 연산자 메서드가 나와 있습니다.

메서드

메서드 이름 설명 C# 쿼리 식 구문 추가 정보
OrderBy 값을 오름차순으로 정렬합니다. orderby Enumerable.OrderBy

Queryable.OrderBy
OrderByDescending 값을 내림차순으로 정렬합니다. orderby … descending Enumerable.OrderByDescending

Queryable.OrderByDescending
ThenBy 2차 정렬을 오름차순으로 수행합니다. orderby …, … Enumerable.ThenBy

Queryable.ThenBy
ThenByDescending 2차 정렬을 내림차순으로 수행합니다. orderby …, … descending Enumerable.ThenByDescending

Queryable.ThenByDescending
Reverse 컬렉션에서 요소의 순서를 반대로 바꿉니다. 해당 없음. Enumerable.Reverse

Queryable.Reverse

이 문서의 다음 예제에서는 이 영역에 대한 공통 데이터 원본을 사용합니다.

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

Student에는 학년 수준, 기본 부서 및 일련의 점수가 있습니다. Teacher에는 교사가 수업을 진행하는 캠퍼스를 식별하는 City 속성도 있습니다. Department에는 부서장 역할을 하는 Teacher에 대한 참조와 이름이 있습니다.

1차 오름차순 정렬

다음 예제에서는 LINQ 쿼리에 orderby 절을 사용하여 교사 배열을 성을 기준으로 오름차순으로 정렬하는 방법을 보여 줍니다.

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

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

메서드 구문을 사용하여 작성된 이와 동일한 쿼리는 다음 코드에 나와 있습니다.

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

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

1차 내림차순 정렬

다음 예제에서는 LINQ 쿼리에 orderby descending 절을 사용하여 교사를 성의 내림차순으로 정렬하는 방법을 보여 줍니다.

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

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

메서드 구문을 사용하여 작성된 이와 동일한 쿼리는 다음 코드에 나와 있습니다.

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

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

2차 오름차순 정렬

다음 예제에서는 LINQ 쿼리에 orderby 절을 사용하여 1차 및 2차 정렬을 수행하는 방법을 보여 줍니다. 교사는 주로 도시를 기준으로 정렬되고 부차적으로 성으로 정렬되며, 둘 다 오름차순으로 정렬됩니다.

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

메서드 구문을 사용하여 작성된 이와 동일한 쿼리는 다음 코드에 나와 있습니다.

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

2차 내림차순 정렬

다음 예제에서는 LINQ 쿼리에 orderby descending 절을 사용하여 1차 정렬을 오름차순으로 수행한 다음 2차 정렬을 내림차순으로 수행하는 방법을 보여 줍니다. 교사는 주로 도시를 기준으로 정렬되고 부차적으로 성으로 정렬됩니다.

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

메서드 구문을 사용하여 작성된 이와 동일한 쿼리는 다음 코드에 나와 있습니다.

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

참고 항목