Section 48.13: IList<T> 에 대한 확장 메소드 예제 - 2 개의 List 비교하기

아래의 확장 메소드를 이용하면 동일한 타입을 갖는 두개의 IList< T > 에 대해 내용물 기반의 비교를 수행할 수 있다.

기본적으로는 list 내의 각 요소들은 그 순서와 요소 자체를 기반으로 비교가 이루어지지만, isOrdered 파라미터에 false 를 넘기면 순서와 상관없이 요소들 자체만으로 비교가 이루어질 것이다.

이 메소드가 정상 동작하려면, 제네릭 타입 TEqualsGetHashCode 메소드를 재정의 (override) 하고 있어야 한다.

사용 예제:

List < string > list1 = new List < string > { "a1", "a2", null, "a3" }; List < string > list2 = new List < string > { "a1", "a2", "a3", null }; list1.Compare(list2); // 이 결과는 false 가 될 것이다 list1.Compare(list2, false); // 이 결과는 true 가 될 것이다. 두 리스트는 순서를 배제할 경우 동일하다

메소드 선언:

public static bool Compare < T > (this IList < T > list1, IList < T > list2, bool isOrdered = true) { if (list1 == null && list2 == null) return true; if (list1 == null || list2 == null || list1.Count != list2.Count) return false; if (isOrdered) { for (int i = 0; i < list2.Count; i++) { var l1 = list1[i]; var l2 = list2[i]; if ( (l1 == null && l2 != null) || (l1 != null && l2 == null) || (!l1.Equals(l2))) { return false; } } return true; } else { List < T > list2Copy = new List < T > (list2); // Dictionary 를 이용해 O(n^2) 복잡도로 계산하지 않고도 구현할 수 있을것이다 for (int i = 0; i < list1.Count; i++) { if (!list2Copy.Remove(list1[i])) return false; } return true; } }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts