2009-05-08 5 views
1

Ich konvertiere DataTables in eine generische Liste und benötige eine schnelle und einfache Möglichkeit, eine Suchfunktion zu implementieren. Es scheint, dass ich ein Prädikat verwenden muss. Nach weiterer Untersuchung kann ich die Funktionalität noch nicht neu erstellen. Ich habe dieses Prädikat ...Generisches Listen-Äquivalent von DataTable.Rows.Find mit VB.NET?

Private Function ByKey(ByVal Instance As MyClass) As Boolean 
    Return Instance.Key = "I NEED THIS COMPARISON TO BE DYNAMIC!" 
End Function 

Und dann es so nennen ...

Dim Blah As MyClass = MyList.Find(AddressOf ByKey) 

Aber ich habe keine Möglichkeit, in einer Schlüsselvariable zu diesem Prädikat übergeben Sie den Vergleich zu tun, wie Ich habe das mit DataTable gemacht ...

Dim MyRow as DataRow = MyTable.Rows.Find(KeyVariable) 

Wie kann ich eine Prädikat-Delegate-Funktion in VB.NET einrichten, um dies zu erreichen?

Empfehlen Sie nicht LINQ oder Lambdas, da dies in Bezug auf .NET Version 2.0 ist.

Antwort

5

Setzen Sie einfach Ihre Prädikat in einer Klasseninstanz:

Public Class KeyMatcher 
    Public Sub New(ByVal KeyToMatch As String) 
     Me.KeyToMatch = KeyToMatch 
    End Sub 

    Private KeyToMatch As String 

    Public Function Predicate(ByVal Instance As MyClass) As Boolean 
     Return Instance.Key = KeyToMatch 
    End Function 
End Class 

und dann:

Dim Blah As MyClass = MyList.Find(AddressOf New KeyMatcher("testKey").Predicate) 

Wir können sogar ein wenig Phantasie und machen diese generic:

Public Interface IKeyed(Of KeyType) 
    Public Key As KeyType 
End Interface 

Public Class KeyMatcher(Of KeyType) 
    Public Sub New(ByVal KeyToMatch As KeyType) 
     Me.KeyToMatch = KeyToMatch 
    End Sub 

    Private KeyToMatch As KeyType 

    Public Function Predicate(ByVal Instance As IKeyed(Of KeyType)) As Boolean 
     Return Instance.Key = KeyToMatch 
    End Function 
End Class 

Und Aktivieren Sie dann den MyClass-Typ, um die neue IKeyed-Schnittstelle

zu implementieren
+0

Das sieht so aus als würde es funktionieren. Vielen Dank! Ich werde ein paar Tests machen und zurück zu dir kommen. –

+0

Danke nochmal! Ich habe am Ende eine generische Klasse geschrieben, die auch Reflektion verwendet, so dass jedes Feld mit einem beliebigen Wert eines beliebigen Typs abgeglichen werden kann. Es ist sicherlich nicht so effizient wie ohne Reflexion, aber ich brauchte Flexibilität. –