사용자 지정 정렬을 위한 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- IEquatable 구현
- GetHashCode 재정의
- IComparable 구현
- 사용자 지정 정렬을 위한 IComparer