在两个不同类型的列表中查找项目中的相等性

时间:2009-06-09 08:40:30

标签: vb.net .net-2.0 comparison list

我有两个派生自同一基类的对象。

让我们说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

但这似乎不起作用。

修改 进一步澄清。如果我打电话

lst1.contains(instance of ClassA)

这会引发错误,因为它(正确地)期望获得ClassB的实例。

1 个答案:

答案 0 :(得分:0)

当你说“不起作用”时......会发生什么?

覆盖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);
    }

如果你正在做很多这样的事情,或者列表很长 - 你可能会先从已知的id建立一个哈希集中受益(再次,一个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);
    }

这具有散列所有数据的初始成本,但整体上可能明显更快。