我试图在VB.NET中使用in this answer.
描述的功能实现Map
应该使用IEnumerable(Of TIn)
和Function(Of TIn, TOut)
,对每个元素执行该功能,然后返回新 IEnumerable(Of TOut)
。
我知道VB.NET不是一种真正的功能语言。我有业务需求,但仍想使用一些功能花絮,尤其是与LINQ结合使用。
我们会问here类似的问题,但问题和答案实际上是关于实施Each
。
答案 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)
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)
,因此可以接受更广泛的输入。
我向任何建议改进绩效的人开放。