Postupy: Vytvoření výrazu lambda (Visual Basic)

Výraz lambda je funkce nebo podprogram, který nemá název. Výraz lambda lze použít všude, kde je typ delegáta platný.

Vytvoření jednořádkové funkce výrazu lambda

  1. V jakékoli situaci, kdy je možné použít typ delegáta, zadejte klíčové slovo Function, jako v následujícím příkladu:

    Dim add1 = Function

  2. V závorkách zadejte přímo za Functionparametry funkce. Všimněte si, že nezadáte název za Function.

    Dim add1 = Function (num As Integer)

  3. Za seznamem parametrů zadejte jeden výraz jako tělo funkce. Hodnota, na kterou se výraz vyhodnotí, je hodnota vrácená funkcí. Klauzuli nepoužíváte As k určení návratového typu.

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

    Výraz lambda zavoláte předáním celočíselného argumentu.

    ' The following line prints 6.
    Console.WriteLine(add1(5))
    
  4. Stejný výsledek lze provést v následujícím příkladu:

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

Vytvoření podprogramu výrazu lambda s jedním řádkem

  1. V jakékoli situaci, kdy lze použít typ delegáta, zadejte klíčové slovo Sub, jak je znázorněno v následujícím příkladu.

    Dim add1 = Sub

  2. V závorkách zadejte přímo za Subparametry podprogramu. Všimněte si, že nezadáte název za Sub.

    Dim add1 = Sub (msg As String)

  3. Za seznamem parametrů zadejte jeden příkaz jako tělo podprogramu.

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

    Výraz lambda zavoláte předáním řetězcového argumentu.

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

Vytvoření víceřádkové funkce výrazu lambda

  1. V jakékoli situaci, kdy lze použít typ delegáta, zadejte klíčové slovo Function, jak je znázorněno v následujícím příkladu.

    Dim add1 = Function

  2. V závorkách zadejte přímo za Functionparametry funkce. Všimněte si, že nezadáte název za Function.

    Dim add1 = Function (index As Integer)

  3. Stiskněte ENTER. Příkaz End Function se přidá automaticky.

  4. Do těla funkce přidejte následující kód, který vytvoří výraz a vrátí hodnotu. Klauzuli nepoužíváte As k určení návratového typu.

    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
    

    Výraz lambda zavoláte předáním celočíselného argumentu.

    Dim sortColumn = getSortColumn(0)
    

Vytvoření podprogramu výrazu lambda s více spojnicemi

  1. V jakékoli situaci, kdy je možné použít typ delegáta, zadejte klíčové slovo Sub, jak je znázorněno v následujícím příkladu:

    Dim add1 = Sub

  2. V závorkách zadejte přímo za Subparametry podprogramu. Všimněte si, že nezadáte název za Sub.

    Dim add1 = Sub (msg As String)

  3. Stiskněte ENTER. Příkaz End Sub se přidá automaticky.

  4. Do těla funkce přidejte následující kód, který se spustí při vyvolání podprogramu.

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

    Výraz lambda zavoláte předáním řetězcového argumentu.

    writeToLog("Application started.")
    

Příklad

Běžným použitím výrazů lambda je definovat funkci, která se dá předat jako argument pro parametr, jehož typ je Delegate. V následujícím příkladu GetProcesses vrátí metoda pole procesů spuštěných v místním počítači. Metoda Where z Enumerable třídy vyžaduje Boolean jako argument delegáta. Výraz lambda v příkladu se pro tento účel používá. Vrátí True pro každý proces, který má pouze jedno vlákno, a ty jsou vybrány v 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

Předchozí příklad je ekvivalentní následujícímu kódu, který je napsaný v syntaxi LINQ (Language-Integrated Query):

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

Viz také