2009-06-09 5 views
1

J'ai deux objets dérivés de la même classe de base. Supposons que ObjA soit la classe de base et ClassB et ClassC héritent d'ObjA.Recherche de l'égalité dans les éléments de deux listes de types différents

Si j'ai un

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

et je veux vérifier l'existence de quelque chose qui est en lst1 qu'il est dans liste2, maintenant je ne suis intéressé à comparer contre un bit d'information clé que est déclaré dans la classe de base et est une chaîne.

Comment puis-je parcourir la comparaison lst1 avec list2? Je pensais que je pouvais, je surcharger/remplacer la méthode Equals mais j'ai pas de joie pour l'une des classes et dire quelque chose semblable à

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 

Mais cela ne semble pas fonctionner.

EDIT: Informations supplémentaires. Si je l'appelle

lst1.contains(instance of ClassA) 

Cela jette une erreur comme (à juste titre) prévoit d'obtenir une instance de ClassB.

Répondre

0

Quand vous dites "ne fonctionne pas" ... que se passe-t-il? Remplacer Equals (sans surcharger GetHashCode()) est une mauvaise idée et introduit beaucoup de complexité. List<T> ne vous permet pas de passer dans un IEqualityComparer<> personnalisé, donc OMI, vous devriez le vérifier manuellement (foreach etc).

Ou dans .NET 3.5, LINQ; Je vais donner un exemple C# (VB est pas mon point fort):

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

Si vous faites beaucoup de cela, ou les listes sont longues - vous pouvez bénéficier de la construction d'un hachage ensemble de la connue ids premier (encore une fois, un exemple C# - désolé):

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

Cela a le coût initial de hashing toutes les données, mais il peut être beaucoup plus rapide d'ensemble.

Questions connexes