如何在VB.NET中实现Map函数

时间:2015-06-23 16:47:48

标签: vb.net functional-programming

我试图在VB.NET中使用in this answer.

描述的功能实现Map

应该使用IEnumerable(Of TIn)Function(Of TIn, TOut),对每个元素执行该功能,然后返回 IEnumerable(Of TOut)

我知道VB.NET不是一种真正的功能语言。我有业务需求,但仍想使用一些功能花絮,尤其是与LINQ结合使用。

我们会问here类似的问题,但问题和答案实际上是关于实施Each

2 个答案:

答案 0 :(得分:2)

超级简单

   Public Function map(equation As Func(Of Object, Object))

    For i = 0 To rows - 1
        For j = 0 To cols - 1
            Dim val = data(i, j)
            data(i, j) = equation(val)
        Next
    Next
End Function

并使用它

 m.map(Function(x) 3 > x)
 m.map(Address Sigmoid)

答案 1 :(得分:1)

感谢@Sehnsucht指出LINQ中已经是Map函数,称为Select

这是我原来的答案,绝对不如设计LINQ的聪明人所创造的那样好:

这是一个可以放在根命名空间中的Module的扩展方法:

Module Extensions
    <System.Runtime.CompilerServices.Extension> _
    Public Function Map(Of TIn, TOut)(ByVal a As IEnumerable(Of TIn), ByVal f As Func(Of TIn, TOut)) As IList(Of TOut)
        Dim l As New List(Of TOut)
        For Each i As TIn In a
            Dim x = f(i)
            l.Add(x)
        Next
        Return l
    End Function
End Module

可以这样称呼:

Sub Main()
    Dim Test As New List(Of Double) From {-10000000, -1, 1, 1000000}
    Dim Result1 = Test.Map(Function(x) x.ToString("F2"))
    'Result1 is of type IList(Of String)
    Dim Result2 = Test.Map(AddressOf IsPositive)
    'Result2 is of type IList(Of Boolean)
    Dim Result3 = Map(Test, Function(y) y + 1)
    'Result3 is of type IList(Of Double)
End Sub

Private Function IsPositive(d As Double) As Boolean
    If d > 0 then
        Return True
    Else
        Return False
    End If
End Function

我返回IList(Of TOut)因为它对我的目的更有用(而且,它返回了一个列表!)。它可以通过将返回行更改为IEnumerable(Of TOut)来返回Return l.AsEnumerable()。它接受IEnumerable(Of TIn)而不是IList(Of TIn),因此可以接受更广泛的输入。

我向任何建议改进绩效的人开放。