【问题标题】:How to Implement Map Function in VB.NET如何在VB.NET中实现地图功能
【发布时间】:2019-12-10 01:43:56
【问题描述】:

我正在尝试在 VB.NET 中实现 Map 并使用 in this answer. 描述的功能

它需要一个IEnumerable(Of TIn) 和一个Function(Of TIn, TOut),对每个元素执行函数,并返回一个new IEnumerable(Of TOut)

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

here问了一个类似的问题,但问题和答案实际上是关于实现Each

【问题讨论】:

  • 你想要的那个 Map 已经在那里了,那就是 Linq Select 方法
  • 噢,该死。我搜索了很长一段时间,但在 VB.NET 中找不到任何 Map 函数,而我应该记得 Select。谢谢你。至少我学到了很多关于Generics的知识。

标签: vb.net functional-programming


【解决方案1】:

感谢 @Sehnsucht 指出 LINQ 中已经有一个名为 SelectMap 函数

这是我最初的答案,绝对不如设计 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),因为它对我的目的更有用(而且,它返回一个列表!)。通过将返回行更改为Return l.AsEnumerable(),它可以返回IEnumerable(Of TOut)。它接受IEnumerable(Of TIn) 而不是IList(Of TIn),因此它可以接受更广泛的输入。

我对任何建议性能改进的人持开放态度。

【讨论】:

  • 如果你真的想自己重新实现它;使用iterator block
  • 谢谢。我正在考虑这个问题,但我不知道如果我在 LINQ-to-SQL 查询上调用 Map 会如何工作。
  • 我不确定您的自动回答是否有用...当有人告诉您有 Select 方法来映射对象时,我会删除问题本身;P
  • @MatíasFidemraizer 我不同意,因为我花了很多时间为 VB.NET 查找 Map 的变体,但没有找到任何东西,所以我花时间实现自己的。我认为这个问题应该保留,所以如果其他人来自另一种语言,它被称为Map,并且像我一样在不知道词汇的情况下进行搜索,他们就不会浪费时间。
  • @Z_AHK 你花了很多时间,但是例如,我会在不到一分钟的时间内编写你的地图函数......我的意思是,当你知道迭代器如何工作时,这似乎是一个答案像你的一样没用,因为直接使用 LINQ Select 扩展方法更有用......如果你的问答是“LINQ Select 是如何实现的?”......
【解决方案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)

【讨论】:

    猜你喜欢
    • 2020-03-02
    • 2012-08-15
    • 2018-09-23
    • 2011-05-14
    • 2021-06-02
    • 2017-10-14
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多