views:

1488

answers:

2

I am converting DataTables to a generic list and need a quick and easy way to implement a Find function. It seems I am going to have to use a Predicate. Upon further investigation, I still can't seem to re-create the functionality. I have this predicate...

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

And then calling it like this...

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

But I have no way to pass in a key variable to this predicate to do the comparison, as I used to do with DataTable...

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

How can I setup a predicate delegate function in VB.NET to accomplish this?

Do not recommend LINQ or lambdas because this is question is regarding .NET version 2.0.

+4  A: 

Just put your predicate in a class instance:

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

and then:

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

We can even get a little fancy and make this 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

And then make your MyClass type implement the new IKeyed interface

Joel Coehoorn
That looks like it will work. Thanks! I will do some testing and get back to ya.
Josh Stodola
Thanks again! I ended up writing a generic class that also uses reflection so that it can be used to match any field to any value from any type. It is certainly not as efficient as without reflection, but I needed to flexibility.
Josh Stodola
A: 

Thank you great example vb.net list object find. The first example is working for 100%. But then I try make more generic class (your second example) I have a problems with interface defenition.

Than I try add 'Public Key As KeyType' in interface defenition VS2008 say me what 'Interface members must be methods, properties, events, or type definitions.' In this case the code is not working. I was try add sub or function to interface but expect troubles to use interface in class.

Could you please help me resolve this problem.

Thank you for help and your time in advance.

Regards, Andrejs.

Andrejs Pankins