
문자열 비교에 사용되는 클래스
StringComparer는 문자열 비교(정렬, 탐색, 키 비교 등)에 사용되는 비교자(Comparer)와 해시 정책(EqualityComparer)을 제공하는 클래스다.
IComparer<string>와 IEqualityComparer<string>를 동시에 구현한 문자열 전용 비교자.
정렬(예: Array.Sort)이나 컬렉션(예: Dictionary, HashSet)에 비교 규칙과 해시 규칙을 일관되게 적용할 수 있음.
문화권(culture) 민감성, 대소문자 구분, 바이트순(ordinal) 비교 등 다양한 비교 방식 제공.
StringComparison : string의 인스턴스 메서드들(Equals, IndexOf, CompareTo 등)에 주는 옵션(enum). (ex. StringComparison.OrdinalIgnoreCase)
StringComparer : 컬렉션이나 정렬 API에 넣어 쓰는 비교자/해시 제공 객체. (StringComparer.OrdinalIgnoreCase 등)
두 개념은 같은 비교 규칙을 표현하지만, 용도가 다르다. 컬렉션에서는 StringComparer를 쓴다.
StringComparer.Ordinal
StringComparer.OrdinalIgnoreCase
StringComparer.CurrentCulture / CurrentCultureIgnoreCase
StringComparer.InvariantCulture / InvariantCultureIgnoreCase
StringComparer.Create(CultureInfo culture, bool ignoreCase)
Ordinal 비교는 문자열의 UTF-16 코드 단위(즉, 정수 값)를 바로 비교.
구현이 단순 → 분기 적고 CPU 캐시 친화적 → 빠름.
문화권 비교(CompareInfo)는 언어 규칙, 접두사/접미사, 합성 문자(normalization), 복잡한 유니코드 규칙 등을 처리해야 하므로 추가 로직과 테이블 접근이 필요함. 이 때문에 더 느림.
Dictionary 생성 시 new Dictionary<string, TValue>(StringComparer.OrdinalIgnoreCase)var dict = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
dict["Apple"] = 1;
Console.WriteLine(dict.ContainsKey("apple")); // true
(A) 배열 정렬에 적용
string[] arr = new[] { "d", "cc", "bbb", "aaaa" };
// 문화권 무시, 빠른 사전식 정렬
Array.Sort(arr, StringComparer.Ordinal);
// 또는
Array.Sort(arr, StringComparer.OrdinalIgnoreCase);
(B) Dictionary / HashSet에 적용
var set = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
set.Add("Hello");
Console.WriteLine(set.Contains("hello")); // true
(C) 사용자 로컬 정렬(화면 표시용)
// 사용자의 문화권에 따른 정렬을 원할 때
Array.Sort(arr, StringComparer.CurrentCulture);
아이덴티티 / 내부 키 / 파일명 비교 / 성능 최우선 → StringComparer.Ordinal 또는 OrdinalIgnoreCase
UI에서 사용자에게 보여줄 정렬(사람 기준) → StringComparer.CurrentCulture 또는 InvariantCulture
네트워크/저장된 키 비교(교차 플랫폼/언어 간 일관성) → StringComparer.Ordinal
대소문자 무시 필요 → OrdinalIgnoreCase 우선 고려. 성능과 일관성 면에서 보통 최선.