C# - 리스트가 같은지 비교 (SequenceEqual)

두개의 리스트가 서로 같은 요소를 갖고 있는지, 같은지 비교하는 방법을 소개합니다.

1. SequenceEqual()를 이용한 방법

Enumerable.SequenceEqual(list1, list2)는 list1과 list2가 동일한 요소를 갖고 있고, 같은 순서로 저장되어있을 때 true를 리턴합니다.

모두 같은 요소들을 갖고 있지만, 저장 순서는 다를 때는 false를 리턴합니다.

아래와 같이 두 리스트가 같은지 비교를 할 수 있습니다.

using System;

namespace Example {
    public class Program {
        public static void Main(string[] args) {

            List<int> list1 = new List<int>() {1, 2, 3, 4, 5};
            List<int> list2 = new List<int>() {1, 2, 3, 4, 5};
            List<int> list3 = new List<int>() {5, 4, 3, 2, 1};

            bool result = Enumerable.SequenceEqual(list1, list2);
            Console.WriteLine("list1 == list2 ? " + result);

            result = Enumerable.SequenceEqual(list1, list3);
            Console.WriteLine("list1 == list3 ? " + result);
        }
    }
}

Output:

list1 == list2 ? True
list1 == list3 ? False

만약 list1이 null이 아니라면, list1.SequenceEqual() 처럼 리스트에서 직접 함수를 호출하여 다른 리스트와 비교할 수 있습니다.

List<int> list1 = new List<int>() {1, 2, 3, 4, 5};
List<int> list2 = new List<int>() {1, 2, 3, 4, 5};
List<int> list3 = new List<int>() {5, 4, 3, 2, 1};

bool result = list1.SequenceEqual(list2);
Console.WriteLine("list1 == list2 ? " + result);

result = list1.SequenceEqual(list3);
Console.WriteLine("list1 == list3 ? " + result);

Output:

list1 == list2 ? True
list1 == list3 ? False

2. 순서는 무시하고, 같은 요소를 갖고 있는지 비교

리스트에 요소가 저장된 순서를 비교하지 않고, 단순히 두개의 리스트가 서로 동일한 요소들을 갖고 있는지만 비교하여 같음을 비교하고 싶을 때가 있습니다.

이럴 때는, 먼저 리스트를 정렬하고 그 다음에 SequenceEqual()로 비교하면 됩니다.

아래 예제에서 OrderBy()는 리스트를 정렬하는 함수이며, 정렬할 때 어떤 key를 사용할 것인지 함수로 key 정보를 알려줘야 합니다.

using System;

namespace Example {
    public class Program {
        public static void Main(string[] args) {

            List<int> list1 = new List<int>() {1, 2, 3, 4, 5};
            List<int> list2 = new List<int>() {1, 2, 3, 4, 5};
            List<int> list3 = new List<int>() {5, 4, 3, 2, 1};

            bool result = Enumerable.SequenceEqual(
                    list1.OrderBy(a => a), list2.OrderBy(a => a));
            Console.WriteLine("list1 == list2 ? " + result);

            result = Enumerable.SequenceEqual(
                    list1.OrderBy(a => a), list3.OrderBy(a => a));
            Console.WriteLine("list1 == list3 ? " + result);
        }
    }
}

Output:

list1 == list2 ? True
list1 == list3 ? True

3. Contains()를 이용한 방법 (순서 무시)

List.Contains()는 리스트에 어떤 요소가 있을 때 true를 리턴합니다.

Contains()를 이용하여 순서는 무시하고 리스트에 동일 요소가 있는지 확인할 수 있습니다.

아래와 같이 리스트의 길이가 다르면 서로 다르다고 판단하고, 길이가 같으면 Contains()로 모든 요소가 다른 리스트에 있는지 확인합니다.

using System;

namespace Example {
    public class Program {

        public static bool isEqual(List<int> list1, List<int> list2) {
            if (list1.Count() != list2.Count()) {
                return false;
            }
            foreach (var n in list1) {
                if (!list2.Contains(n)) {
                    return false;
                }
            }
            return true;
        }

        public static void Main(string[] args) {

            List<int> list1 = new List<int>() {1, 2, 3, 4, 5};
            List<int> list2 = new List<int>() {1, 2, 3, 4, 5};
            List<int> list3 = new List<int>() {5, 4, 3, 2, 1};
            List<int> list4 = new List<int>() {1, 2, 4, 8, 16};

            Console.WriteLine(isEqual(list1, list2));
            Console.WriteLine(isEqual(list1, list3));
            Console.WriteLine(isEqual(list1, list4));
        }
    }
}

Output:

True
True
False
Loading script...
codechachaCopyright ©2019 codechacha