0Pricing
C# Academy · 강의

사용자 지정 정렬을 위한 IComparer

비교자를 사용해 다른 정렬 순서를 제공합니다.

사용자 지정 정렬을 위한 IComparer은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

다양한 방식으로 정렬하기

형식에는 IComparable<T>을 통한 자연 순서가 하나만 있습니다. 같은 데이터를 다른 방식으로 정렬하려면 호출 위치에서 IComparer<T> 또는 Comparison<T> 대리자를 전달하십시오.

IComparer<T> 구현하기

IComparer<T>은 Compare(x, y) 메서드를 가진 별도의 개체입니다. CompareTo와 동일하게 음수, 0, 양수를 사용하는 계약을 따릅니다.

using System;
using System.Collections.Generic;

public class Person
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public override string ToString() => Name + "(" + Age + ")";
}

public class ByName : IComparer<Person>
{
    public int Compare(Person x, Person y)
        => string.Compare(x.Name, y.Name, StringComparison.Ordinal);
}

public class Program
{
    public static void Main()
    {
        var people = new List<Person> { new Person("Zoe", 1), new Person("Ann", 2) };
        people.Sort(new ByName());
        Console.WriteLine(string.Join(", ", people));
    }
}

하나의 형식에 여러 비교기 사용하기

여러 비교기를 정의하고 정렬할 때마다 하나를 선택할 수 있습니다. 여기서는 같은 사람들을 필요에 따라 이름 또는 나이로 정렬할 수 있습니다.

using System;
using System.Collections.Generic;

public class Person
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public override string ToString() => Name + "(" + Age + ")";
}

public class ByAge : IComparer<Person>
{
    public int Compare(Person x, Person y) => x.Age.CompareTo(y.Age);
}

public class Program
{
    public static void Main()
    {
        var people = new List<Person> { new Person("Ann", 40), new Person("Bo", 20) };
        people.Sort(new ByAge());
        Console.WriteLine(string.Join(", ", people));
    }
}

Comparison<T> 대리자

한 번만 수행하는 정렬에서는 전체 클래스보다 Comparison<T> 대리자(대개 람다)가 더 간결합니다. List.Sort에 직접 전달할 수 있습니다.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var words = new List<string> { "banana", "fig", "apple" };
        // Sort by length using a Comparison<string> lambda
        words.Sort((a, b) => a.Length.CompareTo(b.Length));
        Console.WriteLine(string.Join(", ", words));
    }
}

비교기로 내림차순 정렬하기

Compare 내부에서 피연산자의 순서를 바꾸면 순서를 뒤집을 수 있습니다. 이렇게 하면 형식 자체를 수정하지 않고 내림차순으로 정렬할 수 있습니다.

using System;
using System.Collections.Generic;

public class DescendingInt : IComparer<int>
{
    public int Compare(int x, int y) => y.CompareTo(x);
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 3, 1, 4, 1, 5 };
        nums.Sort(new DescendingInt());
        Console.WriteLine(string.Join(", ", nums));
    }
}

OrderBy에서 비교기 사용하기

LINQ의 OrderBy는 두 번째 인수로 IComparer<TKey>를 받아 선택한 키를 비교하는 방식을 사용자 지정할 수 있게 합니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class CaseInsensitive : IComparer<string>
{
    public int Compare(string x, string y)
        => string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
}

public class Program
{
    public static void Main()
    {
        var names = new[] { "bob", "Alice", "carol" };
        foreach (var n in names.OrderBy(x => x, new CaseInsensitive()))
            Console.WriteLine(n);
    }
}

여러 키 비교하기

비교기는 우선순위에 따라 여러 키로 정렬할 수 있습니다. 첫 번째 키를 계산하고, 값이 같으면 다음 키로 넘어갑니다.

using System;
using System.Collections.Generic;

public class Employee
{
    public string Dept;
    public int Salary;
    public Employee(string dept, int salary) { Dept = dept; Salary = salary; }
    public override string ToString() => Dept + ":" + Salary;
}

public class ByDeptThenSalary : IComparer<Employee>
{
    public int Compare(Employee x, Employee y)
    {
        int byDept = string.Compare(x.Dept, y.Dept, StringComparison.Ordinal);
        return byDept != 0 ? byDept : x.Salary.CompareTo(y.Salary);
    }
}

public class Program
{
    public static void Main()
    {
        var staff = new List<Employee>
        {
            new Employee("IT", 50), new Employee("HR", 40), new Employee("IT", 30)
        };
        staff.Sort(new ByDeptThenSalary());
        Console.WriteLine(string.Join(", ", staff));
    }
}

Comparer.Create 간단히 사용하기

Comparer<T>.Create는 람다에서 IComparer<T>을 생성합니다. 따라서 대리자의 간결함과 비교기가 필요한 인터페이스 API를 함께 활용할 수 있습니다.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var byLengthDesc = Comparer<string>.Create((a, b) => b.Length.CompareTo(a.Length));
        var words = new List<string> { "hi", "hello", "hey" };
        words.Sort(byLengthDesc);
        Console.WriteLine(string.Join(", ", words));
    }
}

컬렉션 간에 비교기 재사용하기

하나의 비교기 인스턴스로 정렬, 검색 및 정렬된 집합을 처리할 수 있습니다. 한 번 정의해 두면 사용하는 모든 곳에서 정렬 규칙이 일관되게 유지됩니다.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        IComparer<int> desc = Comparer<int>.Create((a, b) => b.CompareTo(a));
        var set = new SortedSet<int>(desc) { 1, 5, 3 };
        Console.WriteLine(string.Join(", ", set));
    }
}

IComparable과 IComparer 중 선택하기

형식에 내장된 하나의 자연 순서에는 IComparable<T>을 사용하십시오. 호출 위치에서 결정하는 여러 대체 순서나 상황별 순서에는 IComparer<T> 또는 Comparison<T>을 사용하십시오.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 5, 2, 8, 1 };
        nums.Sort(); // natural ascending (int is IComparable)
        Console.WriteLine(string.Join(", ", nums));
        nums.Sort((a, b) => b - a); // custom descending via delegate
        Console.WriteLine(string.Join(", ", nums));
    }
}

직접 해 보기

요소 형식을 전혀 수정하지 않고 비교기와 람다를 사용하여 하나의 목록을 세 가지 방식으로 정렬해 보십시오.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var words = new List<string> { "pear", "fig", "apple", "kiwi" };

        words.Sort(); // natural alphabetical
        Console.WriteLine(string.Join(", ", words));

        words.Sort((a, b) => a.Length.CompareTo(b.Length)); // by length
        Console.WriteLine(string.Join(", ", words));

        words.Sort(Comparer<string>.Create((a, b) => b.CompareTo(a))); // reverse alphabetical
        Console.WriteLine(string.Join(", ", words));
    }
}

빠른 확인

알맞은 순서 지정 추상화를 선택해 보십시오.

복습

사용자 지정 정렬은 호출 위치에서 전달한 비교기를 사용합니다.

  • IComparer<T>은 음수, 0, 양수 계약에 따라 Compare(x, y)를 구현합니다.
  • Comparison<T> 대리자와 람다는 한 번만 수행하는 정렬에 적합합니다.
  • Comparer<T>.Create는 람다와 인터페이스를 연결합니다.
  • 자연 순서에는 IComparable을 사용하고, 대체 순서에는 비교기를 사용하십시오.

자주 묻는 질문

“사용자 지정 정렬을 위한 IComparer” 강의는 무료인가요?

네 — “사용자 지정 정렬을 위한 IComparer” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“사용자 지정 정렬을 위한 IComparer”에서 뭘 배우나요?

비교자를 사용해 다른 정렬 순서를 제공합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“사용자 지정 정렬을 위한 IComparer” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. IEquatable 구현
  2. GetHashCode 재정의
  3. IComparable 구현
  4. 사용자 지정 정렬을 위한 IComparer
← C# Academy(으)로 돌아가기