Практическое руководство. Создание лямбда-выражения (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))
Создание одностроковой подпрограммы-лямбда-выражения
В любой ситуации, когда можно использовать тип делегата, введите ключевое слово 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
См. также
Задачи
Практическое руководство. Передача процедур другой процедуре в Visual Basic
Ссылки
Оператор Function (Visual Basic)
Основные понятия
Лямбда-выражения (Visual Basic)
Знакомство с LINQ в Visual Basic