2008-10-14 17 views
12

Ist es möglich, nach einem Objekt durch eine seiner Eigenschaften in einer Generischen Liste zu suchen?Suche nach Objekt in der Generischen Liste

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 

Dann laden und

Dim list as new list(Of Customer) 

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

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

Suche Wie kann ich Kundenobjekt mit id = 1 zurückkehren? Hat das mit dem "Prädikat" in Generika zu tun?

Hinweis: Ich mache das in VB.NET.

Antwort

19

Ja, hat dies alles mit Prädikaten zu tun :)

Sie wollen die Find(Of T) Methode. Sie müssen ein Prädikat übergeben (was in diesem Fall eine Art von Delegaten ist). Wie Sie diesen Delegaten erstellen, hängt davon ab, welche Version von VB Sie verwenden. Wenn Sie VB9 verwenden, können Sie einen Lambda-Ausdruck verwenden. (Wenn Sie VB9 verwenden Sie können LINQ verwenden sollen statt finden (Of T) in erster Linie wohlgemerkt). Die Lambda-Ausdruck Form wäre so etwas wie:

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

Ich bin nicht sicher wenn VB8 anonyme Methoden auf die gleiche Weise wie C# 2 unterstützt. Wenn Sie dies von VB8 aus anrufen müssen, werde ich sehen, was ich mir vorstellen kann. (Ich bin eher ein C# Person wirklich :)

+0

Ich benutze VB9 On 2.0 und nicht 3.5 zu diesem Projekt :(Ich werde den Lambda-Ausdruck einen Schuss geben. Danke! –

+0

Wenn Sie VB9 aber beschränkt auf .NET 2.0 verwenden, möchten Sie vielleicht LINQBridge betrachten http://www.albahari.com/nutshell/linqbridge.aspx Es ist im Grunde eine LINQ to Objects-Implementierung, die auf .NET 2.0 abzielt. –

+0

danke für ein Beispiel für ein Liner-Prädikat. – TWood

7

Im Allgemeinen müssen Sie Prädikate verwenden:

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) 

oder mit Inline-Methoden:

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

Sie auch die Methode equals überlasten könnte und dann tu ein contains. wie dies

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

würde die Methode equals wie diese Nicht getestet

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

schaut dann, aber es sollte nahe genug sein.

Verwandte Themen