2009-06-09 7 views
1

동일한 기본 클래스에서 파생 된 두 개의 개체가 있습니다.다른 유형의 두 목록에있는 항목의 동일성 찾기

ObjA가 기본 클래스이고 ClassB와 ClassC가 ObjA를 상속한다고 가정합니다. 나는

dim lst1 as List(Of ClassB) 
dim list2 as List(Of ClassA) 

등을하고 난 뭔가가리스트 2에 lst1에있는의 존재를 확인하려는 경우

은, 지금은 그 정보의 하나의 키 비트에 대해 비교에만 관심 기본 클래스에서 선언되며 문자열입니다.

list2와 비교하여 lst1을 반복 할 수 있습니까? 난 내가 Equals 메서드를 오버라이드 (override)하지만 클래스 중 하나에 대한 기쁨이없는 오전 말할 유사한 어떤 것을

Public Overloads Overrides Function Equals(ByVal obj As Object) As Boolean 
     Dim temp As ClassA = TryCast(obj, ClassA) 
     If temp.Id = Me.Id Then 
      Return True 
     Else 
      Return False 
     End If 
    End Function 

으로하지만이 작동하지 않는 것/과부하 수 있다고 생각.

편집 : 추가 설명. 전화가 걸리는 경우

(올바르게) ClassB의 인스턴스를 가져올 것으로 예상되므로 오류가 발생합니다.

답변

0

"작동하지 않는다"고하면 ... 어떻게됩니까?

(GetHashCode()을 재정의하지 않고) Equals을 재정의하는 것은 바람직하지 않으며 많은 복잡성을 초래합니다. List<T>은 사용자가 IEqualityComparer<> 사용자 지정을 허용하지 않으므로 IMO를 수동으로 확인해야합니다 (foreach 등).

또는 .NET 3.5에서 LINQ; 나는 (VB 내 장점되지 않습니다)는 C# 예제를주지 :

foreach (ClassB item in list1) 
    { 
     bool isInSecondList = list2.Any(x=>x.Id == item.Id); 
     Console.WriteLine(isInSecondList); 
    } 

이 많이하고있는, 또는 목록이 긴 경우 - 당신이 건물에서 혜택을 누릴 수있는 해시 설정 알려진 처음으로 Cids (다시 C# 예제 - 미안) :

var ids = new HashSet<int>(list2.Select(x => x.Id)); 
    foreach (ClassB item in list1) 
    { 
     bool isInSecondList = ids.Contains(item.Id); 
     Console.WriteLine(isInSecondList); 
    } 

이것은 모든 데이터를 해시하는 초기 비용이 있지만 전반적으로 훨씬 빠릅니다.