Нахождение равенства в элементах в двух списках разных типов - PullRequest
1 голос
/ 09 июня 2009

У меня есть два объекта, которые являются производными от одного базового класса.

Допустим, ObjA является базовым классом, а ClassB и ClassC наследуют ObjA.

Если у меня есть

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

и я хочу проверить, существует ли что-то, находящееся в lst1, которое находится в списке list2, теперь меня интересует только сравнение с одним ключевым битом информации, которая объявлена ​​в базовом классе и является строкой.

Как пройти через lst1 по сравнению со списком list2? Я думал, что смогу перегрузить / переопределить метод 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

Но, похоже, это не работает.

EDIT: Дальнейшее уточнение. Если я позвоню

lst1.contains(instance of ClassA)

Это выдает ошибку, поскольку (справедливо) ожидает получения экземпляра ClassB.

1 Ответ

0 голосов
/ 09 июня 2009

Когда вы говорите "не работает" ... что происходит?

Переопределение Equals (без переопределения GetHashCode()) является плохой идеей и представляет большую сложность. List<T> не позволяет вам передавать пользовательский IEqualityComparer<>, поэтому IMO вы должны проверить его вручную (foreach и т. Д.).

Или в .NET 3.5, LINQ; Я приведу пример C # (VB не моя сильная сторона):

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

Если вы делаете это много или списки длинные - вам может быть полезно сначала создать хеш-набор известных идентификаторов (опять же, пример на 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);
    }

Это имеет первоначальную стоимость хеширования всех данных, но в целом может быть значительно быстрее.

...