Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 두 개의 List 객체가 같은지 확인하는 방법

C#에서 두 개의 List<T> 객체가 동일한지 확인하는 방법을 알아보겠습니다. 가장 간단한 방법은 Equals() 메서드를 사용하는 것인데, 이때 한 가지 중요한 특징을 이해하고 있어야 합니다.

List<T> 클래스는 Equals() 메서드를 별도로 재정의하지 않기 때문에, 이 메서드는 두 리스트의 내용이 아닌 참조(객체 인스턴스)를 비교합니다. 따라서 저장된 요소가 완전히 같더라도 서로 다른 객체라면 False가 반환됩니다.

예제 1: 서로 다른 두 리스트 비교

아래 코드에서 list1list2는 별개의 객체입니다.

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

list3list2와 동일한 객체를 참조하고 있으므로 True가 반환됩니다.

참고: 요소 단위로 비교하려면 SequenceEqual 사용

리스트에 담긴 요소 값 자체를 순서대로 비교하고 싶다면 LINQ의 SequenceEqual() 메서드를 사용하는 것이 좋습니다.

using System.Linq;

bool isEqual = list1.SequenceEqual(list2);
Console.WriteLine("두 리스트의 요소가 모두 같은가? = " + isEqual);

SequenceEqual()은 두 컬렉션의 요소 개수와 각 위치의 요소 값이 모두 일치하는 경우에만 True를 반환합니다. 단, 이 메서드를 사용하려면 System.Linq 네임스페이스를 추가해야 합니다.

정리

  • Equals(): 두 리스트가 같은 객체(참조)인지 비교 → 내용이 같아도 다른 객체면 False
  • SequenceEqual()(LINQ): 두 리스트의 요소를 순서대로 비교 → 실질적인 값 비교에 적합