如何:创建 Lambda 表达式 (Visual Basic)

Lambda 表达式是一个没有名称的函数或子例程。 只要委托类型有效,就可使用 Lambda 表达式。

创建单行 Lambda 表达式函数

  1. 在可以使用委托类型的任何情况下,键入关键字 Function,如下例所示:

    Dim add1 = Function

  2. 在括号中,直接在 Function 之后,键入函数的参数。 请注意,不要在 Function 之后指定名称。

    Dim add1 = Function (num As Integer)

  3. 在参数列表之后,键入一个表达式作为函数的主体。 表达式计算结果所得的值是函数返回的值。 请勿使用 As 子句指定返回类型。

    Dim add1 = Function(num As Integer) num + 1
    

    可通过传递整数参数来调用 Lambda 表达式。

    ' The following line prints 6.
    Console.WriteLine(add1(5))
    
  4. 也可通过以下示例实现相同的结果:

    Console.WriteLine((Function(num As Integer) num + 1)(5))
    

创建单行 Lambda 表达式子例程

  1. 在可以使用委托类型的任何情况下,键入关键字 Sub,如下例所示。

    Dim add1 = Sub

  2. 在括号中,直接在 Sub 之后,键入例程的参数。 请注意,不要在 Sub 之后指定名称。

    Dim add1 = Sub (msg As String)

  3. 在参数列表后,键入单个语句作为子例程的主体。

    Dim writeMessage = Sub(msg As String) Console.WriteLine(msg)
    

    可通过传递字符串参数来调用 Lambda 表达式。

    ' The following line prints "Hello".
    writeMessage("Hello")
    

创建多行 Lambda 表达式函数

  1. 在可以使用委托类型的任何情况下,键入关键字 Function,如下例所示。

    Dim add1 = Function

  2. 在括号中,直接在 Function 之后,键入函数的参数。 请注意,不要在 Function 之后指定名称。

    Dim add1 = Function (index As Integer)

  3. 按 Enter。 End Function 语句会自动进行添加。

  4. 在函数的主体中,添加以下代码以创建表达式并返回值。 请勿使用 As 子句指定返回类型。

    Dim getSortColumn = Function(index As Integer)
                            Select Case index
                                Case 0
                                    Return "FirstName"
                                Case 1
                                    Return "LastName"
                                Case 2
                                    Return "CompanyName"
                                Case Else
                                    Return "LastName"
                            End Select
                        End Function
    

    可通过传递整数参数来调用 Lambda 表达式。

    Dim sortColumn = getSortColumn(0)
    

创建多行 Lambda 表达式子例程

  1. 在可以使用委托类型的任何情况下,键入关键字 Sub,如下例所示:

    Dim add1 = Sub

  2. 在括号中,直接在 Sub 之后,键入例程的参数。 请注意,不要在 Sub 之后指定名称。

    Dim add1 = Sub (msg As String)

  3. 按 Enter。 End Sub 语句会自动进行添加。

  4. 在函数的主体中,添加以下代码,以在调用子例程时执行。

    Dim writeToLog = Sub(msg As String)
                         Dim log As New EventLog()
                         log.Source = "Application"
                         log.WriteEntry(msg)
                         log.Close()
                     End Sub
    

    可通过传递字符串参数来调用 Lambda 表达式。

    writeToLog("Application started.")
    

示例

Lambda 表达式的常见用途是定义一个函数,该函数可以作为类型为 Delegate 的形参的实参。 在下面的示例中,GetProcesses 方法返回在本地计算机上运行的进程的数组。 Enumerable 类中的 Where 方法需要一个 Boolean 委托作为其参数。 示例中的 Lambda 表达式就是用于此目的。 它为每个只有一个线程的进程返回 True,这些进程可在 filteredList 中进行选择。

Sub Main()

    ' Create an array of running processes.
    Dim procList As Process() = Diagnostics.Process.GetProcesses

    ' Return the processes that have one thread. Notice that the type
    ' of the parameter does not have to be explicitly stated.
    Dim filteredList = procList.Where(Function(p) p.Threads.Count = 1)

    ' Display the name of each selected process.
    For Each proc In filteredList
        MsgBox(proc.ProcessName)
    Next

End Sub

上一个示例等效于以下用语言集成查询 (LINQ) 语法编写的代码:

Sub Main()

    Dim filteredQuery = From proc In Diagnostics.Process.GetProcesses
                        Where proc.Threads.Count = 1
                        Select proc

    For Each proc In filteredQuery
        MsgBox(proc.ProcessName)
    Next
End Sub

请参阅