web-dev-qa-db-ja.com

ジェネリックリストでオブジェクトを検索する

ジェネリックリストのプロパティの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で行っています。

14
Saif Khan

はい、これは述語と関係があります:)

Find(Of T) メソッドが必要です。述語(この場合はデリゲートの一種)を渡す必要があります。そのデリゲートを構築する方法は、使用しているVBのバージョンによって異なります。VB9を使用している場合は、ラムダ式を使用できます(VB9を使用している場合は、そもそもFind(Of T)の代わりにLINQを使用してください。)ラムダ式の形式は次のようになります。

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

ただし、VB8がC#2と同じ方法で匿名メソッドをサポートしているかどうかはわかりません。これをVB8から呼び出す必要がある場合は、何ができるかを確認します。 (私は本当にC#の人です:)

22
Jon Skeet

通常、述語を使用する必要があります。

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)
7
Ozgur Ozcitak

また、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

テストされていませんが、十分に近いはずです。

1
chrissie1

.NET 3.5を使用している場合、これは LINQ to Objects で実行できます。

方法:LINQを使用してArrayListをクエリする

そうでない場合、.NET 2.0では リストのFindメソッド を使用できます。

オブジェクトのプロパティが特定の条件を満たす場合にtrueを返すメソッドを提供する必要があるという考え方です。

0
Aleris