Практическое руководство. Создание лямбда-выражения (Visual Basic)
Лямбда-выражение — это функция или подпрограмма, которая не имеет имени. Лямбда-выражение можно использовать везде, где допустимый тип делегата.
Создание лямбда-функции однострочного выражения
В любой ситуации, когда можно использовать тип делегата, введите ключевое слово
Function
, как показано в следующем примере:Dim add1 =
Function
В скобках непосредственно после
Function
введите параметры функции. Обратите внимание, что не укажите имя послеFunction
.Dim add1 = Function
(num As Integer)
В списке параметров введите одно выражение в качестве текста функции. Значение, которое вычисляется выражением, является значением, возвращаемым функцией. Предложение не используется
As
для указания возвращаемого типа.Dim add1 = Function(num As Integer) num + 1
Лямбда-выражение вызывается путем передачи целочисленного аргумента.
' The following line prints 6. Console.WriteLine(add1(5))
Кроме того, в следующем примере выполняется тот же результат:
Console.WriteLine((Function(num As Integer) num + 1)(5))
Создание однострочного лямбда-выражения subroutine
В любой ситуации, когда можно использовать тип делегата, введите ключевое слово
Sub
, как показано в следующем примере.Dim add1 =
Sub
В скобках непосредственно после
Sub
введите параметры подпрограммы. Обратите внимание, что не укажите имя послеSub
.Dim add1 = Sub
(msg As String)
В списке параметров введите одну инструкцию в качестве текста подпрограммы.
Dim writeMessage = Sub(msg As String) Console.WriteLine(msg)
Лямбда-выражение вызывается путем передачи строкового аргумента.
' The following line prints "Hello". writeMessage("Hello")
Создание функции многостроного лямбда-выражения
В любой ситуации, когда можно использовать тип делегата, введите ключевое слово
Function
, как показано в следующем примере.Dim add1 =
Function
В скобках непосредственно после
Function
введите параметры функции. Обратите внимание, что не укажите имя послеFunction
.Dim add1 = Function
(index As Integer)
Нажмите клавишу ВВОД. Инструкция
End Function
добавляется автоматически.В тексте функции добавьте следующий код, чтобы создать выражение и вернуть значение. Предложение не используется
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
Лямбда-выражение вызывается путем передачи целочисленного аргумента.
Dim sortColumn = getSortColumn(0)
Создание вложенных лямбда-выражений с несколькими строками
В любой ситуации, когда можно использовать тип делегата, введите ключевое слово
Sub
, как показано в следующем примере:Dim add1 =
Sub
В скобках непосредственно после
Sub
введите параметры подпрограммы. Обратите внимание, что не укажите имя послеSub
.Dim add1 = Sub
(msg As String)
Нажмите клавишу ВВОД. Инструкция
End Sub
добавляется автоматически.В тексте функции добавьте следующий код для выполнения при вызове подпрограммы.
Dim writeToLog = Sub(msg As String) Dim log As New EventLog() log.Source = "Application" log.WriteEntry(msg) log.Close() End Sub
Лямбда-выражение вызывается путем передачи строкового аргумента.
writeToLog("Application started.")
Пример
Обычное использование лямбда-выражений заключается в определении функции, которую можно передать в качестве аргумента для параметра, тип которого является Delegate
. В следующем примере метод возвращает массив процессов, GetProcesses выполняемых на локальном компьютере. Метод Where из класса требует делегата Enumerable Boolean
в качестве аргумента. Лямбда-выражение в примере используется для этой цели. Он возвращается 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
См. также
- Enumerable
- Лямбда-выражения
- Оператор Function
- Оператор Sub
- Делегаты
- How to: Pass Procedures to Another Procedure in Visual Basic (Практическое руководство. Передача процедур другой процедуре в Visual Basic)
- Оператор Delegate
- Знакомство с LINQ в Visual Basic