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

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

LinkedList 동등성 비교의 기본 원리

C#에서 두 LinkedList<T> 객체가 동일한지 확인하려면 Equals() 메서드를 사용하면 됩니다. 다만 한 가지 중요한 점이 있습니다. LinkedList 클래스는 Equals 메서드를 별도로 재정의하지 않기 때문에 기본적으로 객체의 참조(reference)가 같은지를 비교합니다. 따라서 내용이 완전히 동일하더라도 서로 다른 인스턴스라면 false가 반환되고, 한 변수에 다른 리스트의 참조를 대입한 경우에는 true가 반환됩니다.

예제 1: 같은 참조를 가리키는 경우

아래 코드에서는 list3에 list2의 참조를 그대로 할당한 뒤 두 객체를 비교합니다.

using System;
using System.Collections.Generic;
public class Demo {
   public static void Main(String[] args){
      LinkedList<string> list1 = new LinkedList<string>();
      list1.AddLast("One");
      list1.AddLast("Two");
      list1.AddLast("Three");
      list1.AddLast("Four");
      list1.AddLast("Five");
      Console.WriteLine("Elements in LinkedList1...");
      foreach (string res in list1){
         Console.WriteLine(res);
      }
      LinkedList<string> list2 = new LinkedList<string>();
      list2.AddLast("India");
      list2.AddLast("US");
      list2.AddLast("UK");
      list2.AddLast("Canada");
      list2.AddLast("Poland");
      list2.AddLast("Netherlands");
      Console.WriteLine("Elements in LinkedList2...");
      foreach (string res in list2){
         Console.WriteLine(res);
      }
      LinkedList<string> list3 = new LinkedList<string>();
      list3 = list2;
      Console.WriteLine("Is LinkedList3 equal to LinkedList2? = " + list3.Equals(list2));
   }
}

위 코드의 실행 결과는 다음과 같습니다.

Elements in LinkedList1...
One
Two
Three
Four
Five

Elements in LinkedList2...
India
US
UK
Canada
Poland
Netherlands
Is LinkedList3 equal to LinkedList2? = True

list3 = list2; 문장으로 인해 list3과 list2는 동일한 객체를 가리키게 됩니다. 따라서 Equals 비교 결과는 True입니다.

예제 2: 서로 다른 인스턴스인 경우

이번에는 각각 독립적으로 생성된 두 리스트를 비교해 보겠습니다.

using System;
using System.Collections.Generic;
public class Demo {
   public static void Main(String[] args){
      LinkedList<string> list1 = new LinkedList<string>();
      list1.AddLast("One");
      list1.AddLast("Two");
      list1.AddLast("Three");
      list1.AddLast("Four");
      list1.AddLast("Five");
      Console.WriteLine("Elements in LinkedList1...");
      foreach (string res in list1){
         Console.WriteLine(res);
      }
      LinkedList<string> list2 = new LinkedList<string>();
      list2.AddLast("India");
      list2.AddLast("US");
      list2.AddLast("UK");
      list2.AddLast("Canada");
      list2.AddLast("Poland");
      list2.AddLast("Netherlands");
      Console.WriteLine("Elements in LinkedList2...");
      foreach (string res in list2){
         Console.WriteLine(res);
      }
      Console.WriteLine("Is LinkedList2 equal to LinkedList1? = " + list2.Equals(list1));
   }
}

실행 결과는 다음과 같습니다.

Elements in LinkedList1...
One
Two
Three
Four
Five

Elements in LinkedList2...
India
US
UK
Canada
Poland
Netherlands
Is LinkedList2 equal to LinkedList1? = False

list1과 list2는 각각 별도로 생성된 인스턴스이므로, 저장된 데이터와 무관하게 참조가 서로 다르기 때문에 결과는 False입니다.

참조가 아닌 요소 내용을 비교하려면?

두 리스트가 담고 있는 값 자체를 비교하고 싶다면 LINQ의 SequenceEqual() 메서드를 사용하는 것이 좋습니다. 이 메서드는 두 시퀀스의 요소 개수, 순서, 값을 모두 비교합니다.

// using System.Linq; 네임스페이스 필요
bool isEqual = list1.SequenceEqual(list2);
Console.WriteLine(isEqual); // 요소가 모두 같으면 True 반환

정리하면, Equals()는 객체의 참조 동등성을 확인하는 데 사용되며, 실제 데이터(요소)의 일치 여부를 확인하려면 SequenceEqual()을 사용해야 합니다. 상황에 맞는 메서드를 선택하면 의도하지 않은 비교 결과를 피할 수 있습니다.