是否可以通过通用列表中的某个属性搜索对象?
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中这样做。
答案 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的方法。