ジェネリックリストのプロパティの1つでオブジェクトを検索することは可能ですか?
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で行っています。
はい、これは述語と関係があります:)
Find(Of T) メソッドが必要です。述語(この場合はデリゲートの一種)を渡す必要があります。そのデリゲートを構築する方法は、使用しているVBのバージョンによって異なります。VB9を使用している場合は、ラムダ式を使用できます(VB9を使用している場合は、そもそもFind(Of T)の代わりにLINQを使用してください。)ラムダ式の形式は次のようになります。
list.Find(function(c) c.ID = 1)
ただし、VB8がC#2と同じ方法で匿名メソッドをサポートしているかどうかはわかりません。これをVB8から呼び出す必要がある場合は、何ができるかを確認します。 (私は本当にC#の人です:)
通常、述語を使用する必要があります。
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)
また、equalsメソッドをオーバーロードしてから、containsを実行することもできます。このような
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
テストされていませんが、十分に近いはずです。
.NET 3.5を使用している場合、これは LINQ to Objects で実行できます。
そうでない場合、.NET 2.0では リストのFind
メソッド を使用できます。
オブジェクトのプロパティが特定の条件を満たす場合にtrueを返すメソッドを提供する必要があるという考え方です。