代码之家  ›  专栏  ›  技术社区  ›  Josh Stodola

使用vb.net查找与dataTable.rows.find等效的泛型列表?

  •  1
  • Josh Stodola  · 技术社区  · 16 年前

    我正在将数据表转换为通用列表,需要一种快速而简单的方法来实现find函数。似乎我要用一个谓词。经过进一步的调查,我仍然无法重新创建功能。我有这个谓词…

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

    然后像这样称呼它…

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

    但是我没有办法将一个键变量传递给这个谓词来进行比较,就像我以前对数据表所做的那样…

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

    如何在vb.net中设置谓词委托函数来完成此操作?

    不要推荐Linq或lambdas,因为这是有关.NET版本2.0的问题。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Joel Coehoorn    16 年前

    只需将谓词放在类实例中:

    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
    

    然后:

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

    我们甚至可以得到一点幻想,使这个通用:

    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
    

    然后让myClass类型实现新的ikeyed接口