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
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
V závorkách zadejte přímo za
Function
parametry funkce. Všimněte si, že nezadáte název zaFunction
.Dim add1 = Function
(num As Integer)
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))
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
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
V závorkách zadejte přímo za
Sub
parametry podprogramu. Všimněte si, že nezadáte název zaSub
.Dim add1 = Sub
(msg As String)
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
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
V závorkách zadejte přímo za
Function
parametry funkce. Všimněte si, že nezadáte název zaFunction
.Dim add1 = Function
(index As Integer)
Stiskněte ENTER. Příkaz
End Function
se přidá automaticky.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
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
V závorkách zadejte přímo za
Sub
parametry podprogramu. Všimněte si, že nezadáte název zaSub
.Dim add1 = Sub
(msg As String)
Stiskněte ENTER. Příkaz
End Sub
se přidá automaticky.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