C# "Failed to compare two elements in the array" 원인과 해결
⚠️ C# 오류: "Failed to compare two elements in the array" 원인과 해결 방법
C# 개발 중 List<T>.Sort()나 OrderBy() 등을 사용할 때 다음과 같은 예외 메시지를 접한 적이 있으신가요?
❗ System.InvalidOperationException: Failed to compare two elements in the array.
이 에러는 정렬 작업 중 자주 발생하는 예외로, 원인을 명확히 이해하고 방지하는 방법을 숙지하는 것이 중요합니다. 이 글에서는 이 예외가 발생하는 원인과 안전한 비교를 위한 해결 방법을 정리해 드립니다.
📌 오류 개요
이 예외는 C#의 배열 또는 리스트를 정렬하는 과정에서 발생합니다. Sort(), OrderBy() 등의 메서드는 내부적으로 요소들을 비교하며 정렬을 수행하는데, 비교 과정에서 예외가 발생하면 외부에는 InvalidOperationException으로 감싸져 전달됩니다.
즉, 이 메시지는 비교 중 오류가 발생했다는 의미이며, 대부분은 내부 CompareTo() 또는 IComparer<T>.Compare() 구현상의 문제로 인해 발생합니다.
🧨 주요 원인
1. null 값 비교
비교 대상 객체나 필드가 null인 상태에서 CompareTo()를 호출하면 예외가 발생할 수 있습니다.
2. IComparable 미구현 또는 타입 불일치
정렬 대상 클래스가 IComparable 또는 IComparable<T>를 구현하지 않았거나, 다른 타입 간 비교를 시도할 경우 오류가 발생합니다.
3. 커스텀 Comparer 내부 예외
IComparer<T>를 구현한 Comparer 클래스 내부에서 발생한 예외도 이 메시지로 포장됩니다. 예를 들어 비교에 사용되는 값이 null이거나, 잘못된 접근 등이 이에 해당합니다.
4. 정렬 중 비교 함수 내부에서 런타임 예외 발생
비교 함수에서 외부 메서드를 호출하거나 조건문이 복잡할 경우, 내부 로직에서 예외가 발생하면 동일한 오류 메시지가 나타납니다.
🛠️ 해결 방법
✅ 1. null 값에 대한 안전한 비교 처리
비교 함수 내에서 null 값을 사전에 체크하고 적절한 반환값을 설정해야 합니다.
int SafeCompare<T>(T a, T b) where T : IComparable
{
if (a == null && b == null) return 0;
if (a == null) return -1;
if (b == null) return 1;
return a.CompareTo(b);
}
✅ 2. IComparable 또는 Comparer 구현 검토
정렬 대상 클래스가 IComparable<T>를 정확히 구현했는지 확인하고, 필요 시 Comparer<T>를 명시적으로 전달합니다.
✅ 3. Comparer 내부에서 예외 발생 시 예외 추적
Sort() 내부 예외는 InvalidOperationException에 감싸지므로, InnerException을 통해 실제 원인을 파악할 수 있습니다.
try
{
list.Sort(myComparer);
}
catch (InvalidOperationException ex)
{
Console.WriteLine("오류 메시지: " + ex.Message);
Console.WriteLine("내부 예외: " + ex.InnerException?.Message);
}
✅ 4. 비교 로직의 예외 방어 처리
Comparer 내부에서 사용하는 모든 비교 항목은 null 여부 확인, 타입 확인, 유효성 검사를 선행하여야 합니다.
📈 태그
- C# Failed to compare two elements in the array
- C# 정렬 오류
- InvalidOperationException 비교 실패
- C# Sort 예외
- IComparer 예외 처리
- C# null 비교 오류
- List.Sort() 에러 원인
✅ 마무리
정렬은 데이터 처리에서 매우 중요한 기능이지만, 비교 로직이 불안정하면 Failed to compare two elements in the array와 같은 예외가 발생할 수 있습니다. 이 예외는 단순한 문장으로 보이지만, 실제 원인은 다양하므로 비교 대상의 null 여부, 인터페이스 구현, 내부 예외 로직 등을 꼼꼼히 확인하는 것이 중요합니다.
정렬 전에 데이터와 비교 로직을 철저히 검증해 예외 없는 안전한 코드를 작성해 보세요.