2008-10-14 112 views
12

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

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中这样做。

回答

19

是的,这有一切与谓词:)

您希望Find(Of T)方法。你需要传入一个谓词(在这种情况下它是一种委托类型)。您如何构建该委托取决于您使用的是哪个版本的VB。如果你使用VB9,你可以使用lambda表达式。 (如果你使用VB9你可能想在第一时间使用LINQ,而不是查找(中T),请注意。)Lambda表达式的形式是这样的:

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

我不知道如果VB8以与C#2相同的方式支持匿名方法。如果你需要从VB8调用这个,我会看看我能想出什么。 (我更多的是C#的人真的:)

+0

我正在使用VB9在2.0而不是3.5这个项目:(我会给lambda表达式一个镜头。谢谢! – 2008-10-14 06:24:01

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) 
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")) 

equals方法则是这样的

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

没有测试,但它应该是足够接近。