在通用列表中搜索对象

时间:2008-10-14 06:11:01

标签: vb.net generics

是否可以通过通用列表中的某个属性搜索对象?

Public Class Customer

    Private _id As Integer

    Private _name As String

    Public Property ID() As Integer
        Get
            Return _id
        End Get
        Set
            _id = value
        End Set
    End Property

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set
            _name = value
        End Set
    End Property

    Public Sub New(id As Integer, name As String)
        _id = id
        _name = name
    End Sub

End Class

然后加载并搜索

Dim list as new list(Of Customer)

list.Add(New Customer(1,"A")

list.Add(New Customer(2,"B")

如何返回id = 1的客户对象?这是否与泛型中的“谓词”有关?

注意:我在VB.NET中这样做。

4 个答案:

答案 0 :(得分:22)

是的,这与谓词有关:)

您需要Find(Of T)方法。您需要传入一个谓词(在这种情况下是一种委托)。如何构造该委托取决于您使用的VB版本。如果您使用的是VB9,则可以使用lambda表达式。 (如果你正在使用VB9,你可能想要首先使用LINQ而不是Find(Of T),请注意。)lambda表达式将类似于:

list.Find(function(c) c.ID = 1)

我不确定VB8是否支持匿名方法,就像C#2一样。如果你需要从VB8调用它,我会看到我能想到的。 (我真的更像是一个C#人:)

答案 1 :(得分:7)

通常你需要使用谓词:

list.Add(New Customer(1, "A"))
list.Add(New Customer(2, "B"))

Private Function HasID1(ByVal c As Customer) As Boolean
    Return (c.ID = 1)
End Function

Dim customerWithID1 As Customer = list.Find(AddressOf HasID1)

或使用内联方法:

Dim customerWithID1 As Customer = list.Find(Function(p) p.ID = 1)

答案 2 :(得分:1)

您也可以重载equals方法,然后执行包含。像这样

Dim list as new list(Of Customer)

list.Add(New Customer(1,"A")

list.Add(New Customer(2,"B")

list.contains(new customer(1,"A"))
然后方法看起来像这样

public overrides function Equals(Obj as object) as Boolean
   return Me.Id.Equals(ctype(Obj,Customer).Id
end Function

未经测试但应该足够接近。

答案 3 :(得分:0)

如果您使用的是.NET 3.5,可以使用LINQ to Objects

完成

How to: Query an ArrayList with LINQ

如果没有,在.NET 2.0中,您可以使用Find method of the list

我们的想法是,如果对象的属性满足某个条件,则需要提供一个返回true的方法。