2013-08-05 1 views
1

작은 도우미 메서드 인 contentsToArrayList를 작성했습니다. ICollection을 구현 한 객체를 전달하면 원래 객체와 동일한 요소가 포함 된 ArrayList를 반환합니다. 다른 객체를 전달하면 객체 자체가 포함 된 ArrayList가 반환됩니다.두 개의 ArrayList (C#) 인스턴스가 값의 동일성을 테스트 할 수 있습니까?

이제 메소드를 테스트하고 싶습니다. 내 단위 테스트는 (약식 조금, 좀 더 테스트 케이스를 포함)과 같습니다

 //Arrange 
     int a = 1; 
     ArrayList aAsArrayList = new ArrayList(); 
     aAsArrayList.Add(a); 
     List<int> f = new List<int>() { 4, 5, 6 }; 
     ArrayList fAsArrayList = new ArrayList(f); 

     //Act 
     ArrayList aReturned = contentsToArrayList(a); 
     ArrayList fReturned = contentsToArrayList(f); 

지금 나는 나의 주장 작성하는 방법을 모르겠습니다. 기본적으로 aAsArrayList에 aReturned와 동일한 객체가 포함되어 있는지 확인하려고합니다. 그러나 ArrayList는 참조 유형이므로 값의 동일성이 정의되어 있는지 확신 할 수 없습니다. aReturned == aAsArrayList와 같은 것을 사용하여 arraylists를 쉽게 비교할 수 있습니까? 아니면 arraylist의 각 멤버를 비교해야합니까?

+1

당신은 nunit을 사용하고 있습니까? 그렇다면 CollectionAssert를 사용하십시오 http://www.nunit.org/index.php?p=collectionAssert&r=2.4 – doctorlove

+0

@doctorlove 아니요, 저는 Visual Studio에서 기본 제공 테스트 프레임 워크를 사용하고 있습니다. 하지만 nunit 솔루션에 감사드립니다. –

+0

가능한 경우 ArrayList를 피하십시오. 그냥 ... – nawfal

답변

4

같은 뭔가 나는 그것이 가치의 평등 정의했다 모르겠습니다.

귀하는 정확합니다. 가치 평등이 정의되지 않았습니다. LINQ를 사용 어떤지 ArrayList 객체를 비교하는

한 가지 방법 :

if (aReturned.Cast<object>().SequenceEqual(fReturned.Cast<object>())) { 
    ... 
} 

object에 캐스트는 대부분의 "용서"- 그들은 당신의 검사 결과에 주조 예외를 트리거하지 않습니다. 두 배열에 int 유형의 값이 포함되어있는 경우 Cast<object>()의 유형을 Cast<int>()으로 바꿀 수 있습니다.

+0

감사합니다. SequenceEqual 메서드는 내가 염두에 두었지만 존재하는지 여부를 알 수없는 솔루션의 일종입니다. –

1

는 C# 사양에 대한 비슷한 질문

StackOverflow의

List<T> operator == In the C# Language Specification Version 4

이 질문에 대한 대답은 또한 더

페이지 없다는 것을 의미하는 것인가

MSDN

ArrayList ArrayList 객체에 == 연산자에 대한 재정의가 없음을 나타냅니다.

따라서 한 배열의 각 요소가 다른 배열에 포함되어 있는지 확인하는 도우미 메서드를 작성할 수 있습니다. 두 ArrayLists 모두에 해당되는 경우 원하는 방식으로 동일합니다.

public bool ArrayListsEqual(ArrayList a, ArrayList b) { 
    foreach (obj A in a) { 
     if (!b.Contains(A)) { 
      return false; 
     } 
    } 
    foreach (obj B in b) { 
     if (!a.Contains(B)) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

FYI'=='는 연산자가 아니며 'ArrayListsEqual'은 비효율적입니다 (O (n1) * O (n2)) * 2 –

+1

물론 비효율적입니다. 테스트 도우미 메서드를 작성할 때 우선 순위는 논리가 깔끔하고 명확하므로 테스트를 위해 테스트를 작성할 필요가 없다는 것입니다. –

+0

그렇지만 프레임 워크가 효율적인 'SequenceEqual'을 제공 할 때 우리의 머리를 분해해야하는 이유는 무엇입니까? –