Практическое руководство. Создание лямбда-выражения
Обновлен: Ноябрь 2007
Лямбда-выражение — это функция без имени, которая вычисляет одно выражение и возвращает его значение.
Создание лямбда-выражения
В пределах метода, при любой ситуации, когда можно использовать тип делегата, введите ключевое слово 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))
Пример
Обычно лямбда-выражения используются для определения функции, которая может быть передана в качестве аргумента для параметра типа Delegate. В следующем примере метод GetProcesses возвращает массив процессов, выполняющихся на локальном компьютере. Метод Where класса Enumerable требует делегат типа Boolean в качестве аргумента. Для этого в примере передается лямбда-выражение. Оно возвращает True для каждого процесса, у которого есть только один поток. Такие процессы выбираются в filteredQuery.
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 (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
См. также
Задачи
Практическое руководство. Передача процедур другой процедуре в Visual Basic
Основные понятия
Знакомство с LINQ в Visual Basic