C#에서 두 개의 List<T> 객체가 동일한지 확인하는 방법을 알아보겠습니다. 가장 간단한 방법은 Equals() 메서드를 사용하는 것인데, 이때 한 가지 중요한 특징을 이해하고 있어야 합니다.
List<T> 클래스는 Equals() 메서드를 별도로 재정의하지 않기 때문에, 이 메서드는 두 리스트의 내용이 아닌 참조(객체 인스턴스)를 비교합니다. 따라서 저장된 요소가 완전히 같더라도 서로 다른 객체라면 False가 반환됩니다.
예제 1: 서로 다른 두 리스트 비교
아래 코드에서 list1과 list2는 별개의 객체입니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(String[] args) {
List<string> list1 = new List<string>();
list1.Add("One");
list1.Add("Two");
list1.Add("Three");
list1.Add("Four");
list1.Add("Five");
Console.WriteLine("List1의 요소...");
foreach (string res in list1) {
Console.WriteLine(res);
}
List<string> list2 = new List<string>();
list2.Add("India");
list2.Add("US");
list2.Add("UK");
list2.Add("Canada");
list2.Add("Poland");
list2.Add("Netherlands");
Console.WriteLine("List2의 요소...");
foreach (string res in list2) {
Console.WriteLine(res);
}
Console.WriteLine("List2와 List1은 같은가? = " + list2.Equals(list1));
}
}
실행 결과
List1의 요소...
One
Two
Three
Four
Five
List2의 요소...
India
US
UK
Canada
Poland
Netherlands
List2와 List1은 같은가? = False
두 리스트는 서로 다른 객체이므로 False가 출력됩니다.
예제 2: 동일한 참조를 가진 리스트 비교
이번에는 하나의 리스트를 다른 변수에 할당한 후 비교해 보겠습니다. 참조가 복사되므로 결과는 True가 됩니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(String[] args) {
List<string> list1 = new List<string>();
list1.Add("One");
list1.Add("Two");
list1.Add("Three");
list1.Add("Four");
list1.Add("Five");
Console.WriteLine("List1의 요소...");
foreach (string res in list1) {
Console.WriteLine(res);
}
List<string> list2 = new List<string>();
list2.Add("India");
list2.Add("US");
list2.Add("UK");
list2.Add("Canada");
list2.Add("Poland");
list2.Add("Netherlands");
Console.WriteLine("List2의 요소...");
foreach (string res in list2) {
Console.WriteLine(res);
}
// list2의 참조를 list3에 대입
List<string> list3 = new List<string>();
list3 = list2;
Console.WriteLine("List3과 List2는 같은가? = " + list3.Equals(list2));
}
}
실행 결과
List1의 요소...
One
Two
Three
Four
Five
List2의 요소...
India
US
UK
Canada
Poland
Netherlands
List3과 List2는 같은가? = True
list3은 list2와 동일한 객체를 참조하고 있으므로 True가 반환됩니다.
참고: 요소 단위로 비교하려면 SequenceEqual 사용
리스트에 담긴 요소 값 자체를 순서대로 비교하고 싶다면 LINQ의 SequenceEqual() 메서드를 사용하는 것이 좋습니다.
using System.Linq;
bool isEqual = list1.SequenceEqual(list2);
Console.WriteLine("두 리스트의 요소가 모두 같은가? = " + isEqual);
SequenceEqual()은 두 컬렉션의 요소 개수와 각 위치의 요소 값이 모두 일치하는 경우에만 True를 반환합니다. 단, 이 메서드를 사용하려면 System.Linq 네임스페이스를 추가해야 합니다.
정리
Equals(): 두 리스트가 같은 객체(참조)인지 비교 → 내용이 같아도 다른 객체면FalseSequenceEqual()(LINQ): 두 리스트의 요소를 순서대로 비교 → 실질적인 값 비교에 적합