Section 48.13: IList<T> 에 대한 확장 메소드 예제 - 2 개의 List 비교하기
아래의 확장 메소드를 이용하면 동일한 타입을 갖는 두개의 IList< T >
에 대해 내용물 기반의 비교를 수행할 수 있다.
기본적으로는 list 내의 각 요소들은 그 순서와 요소 자체를 기반으로 비교가 이루어지지만, isOrdered
파라미터에 false
를 넘기면 순서와 상관없이 요소들 자체만으로 비교가 이루어질 것이다.
이 메소드가 정상 동작하려면, 제네릭 타입 T
가 Equals
와 GetHashCode
메소드를 재정의 (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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
48.15: 확장 메소드를 사용하여 편리한 mapper 클래스 만들기 (0) | 2022.12.01 |
---|---|
48.14: 확장 메소드를 통한 강력한 형식 (strongly typed) 의 래퍼 (wrapper) 작성하기 (0) | 2022.12.01 |
48.12: 인터페이스와 확장 메소드를 활용한 DRY 원칙 기반의 코드 및 mix-in 과 유사한 기능 제공하기 (0) | 2022.10.21 |
48.11: 동적 (dynamic) 코드에서의 확장 메소드 미지원 (0) | 2022.10.21 |
48.10: 인터페이스에 확장 메소드 조합하기 (0) | 2022.10.21 |