Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 비교 대리자(Comparison Delegate)를 활용해 복합 형식 목록을 정렬하는 방법

List 클래스의 Sort() 메서드 오버로드는 Comparison 대리자를 인수로 전달받도록 설계되어 있습니다. 복합 형식(사용자 정의 클래스 등)으로 구성된 목록을 정렬하려면 두 개체를 비교하는 로직을 직접 제공해야 하는데, 이때 Comparison 대리자가 핵심 역할을 합니다.

public void Sort(Comparison<T> comparison)

CompareTo 메서드란?

CompareTo 메서드는 현재 인스턴스의 값이 지정된 개체 또는 다른 Int16 인스턴스의 값보다 작은지, 같은지, 큰지를 나타내는 정수를 반환합니다. 반환 값의 의미는 다음과 같습니다.

  • 0보다 작은 값: 현재 인스턴스가 비교 대상보다 작음
  • 0: 두 값이 같음
  • 0보다 큰 값: 현재 인스턴스가 비교 대상보다 큼

C#의 Int16.CompareTo() 메서드는 현재 인스턴스를 지정된 개체 또는 다른 Int16 인스턴스와 비교할 때 사용되며, 이러한 특성 덕분에 정렬 기준을 손쉽게 구현할 수 있습니다.

예제 코드

아래 예제에서는 Employee 클래스 객체들을 담은 List를 만들고, 람다 식으로 ID를 기준으로 정렬한 후 내림차순으로도 출력합니다.

class Program{
   public static void Main(){
      Employee Employee1 = new Employee(){
         ID = 101,
         Name = "Mark",
         Salary = 4000
      };
      Employee Employee2 = new Employee(){
         ID = 103,
         Name = "John",
         Salary = 7000
      };
      Employee Employee3 = new Employee(){
         ID = 102,
         Name = "Ken",
         Salary = 5500
      };
      List<Employee> listEmployees = new List<Employee>();
      listEmployees.Add(Employee1);
      listEmployees.Add(Employee2);
      listEmployees.Add(Employee3);
      Console.WriteLine("Employees before sorting");
      foreach (Employee Employee in listEmployees){
         Console.WriteLine(Employee.ID);
      }
      // 람다 식을 사용한 오름차순 정렬
      listEmployees.Sort((x, y) => x.ID.CompareTo(y.ID));
      Console.WriteLine("Employees after sorting by ID");
      foreach (Employee Employee in listEmployees){
         Console.WriteLine(Employee.ID);
      }
      // 목록을 뒤집어 내림차순으로 표시
      listEmployees.Reverse();
      Console.WriteLine("Employees in descending order of ID");
      foreach (Employee Employee in listEmployees){
         Console.WriteLine(Employee.ID);
      }
   }
   // 방법 1 - 별도 메서드에 비교 로직 정의
   // Employee 객체를 비교하는 메서드
   private static int CompareEmployees(Employee c1, Employee c2){
      return c1.ID.CompareTo(c2.ID);
   }
}
public class Employee{
   public int ID { get; set; }
   public string Name { get; set; }
   public int Salary { get; set; }
}

실행 결과

Employees before sorting
101
103
102
Employees after sorting by ID
101
102
103
Employees in descending order of ID
103
102
101

핵심 정리

  • 람다 식 활용: (x, y) => x.ID.CompareTo(y.ID)처럼 간결하게 오름차순 정렬 기준을 지정할 수 있습니다.
  • 내림차순 정렬: y.ID.CompareTo(x.ID)처럼 비교 순서를 바꾸거나, 위 예제처럼 Sort 후 Reverse()를 호출하는 방법도 가능합니다.
  • 재사용성: 비교 로직이 복잡하다면 예제의 CompareEmployees 메서드처럼 별도의 메서드로 분리하여 재사용하는 것이 좋습니다.