2009-06-09 7 views
1

同じ基本クラスから派生した2つのオブジェクトがあります。異なるタイプの2つのリスト内のアイテムの等価性の検索

ObjAは基本クラスであり、ClassBとClassCはObjAを継承しています。私は

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

とを持っていると私は何かが、それはリスト2にあるLST1にいるの存在を確認したい場合は

は、今私はそれその情報の一つのキービットと比較するにのみ興味を持っています基本クラスで宣言され、文字列です。

list2と比較してlst1を反復処理するにはどうすればよいですか?私は私が私が過負荷になる可能性があり/ Equalsメソッドをオーバーライドすると思ったが、私はクラスのいずれかのための喜びを持っていない午前と

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<>というカスタムを渡すことを許可していないので、手動でチェックする必要があります(foreachなど)。

または.NET 3.5ではLINQ;あなたは、既知のハッシュセットを構築するの恩恵を受けることができる - あなたはこのをたくさんやっている、またはリストが長い場合

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

:私はC#の例を(VBは私の強いポイントではありません)あげます最初のIDS(再び、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); 
    } 

これは、すべてのデータをハッシュの初期費用を持っていますが、大幅に高速化全体のかもしれません。

関連する問題