📅  最后修改于: 2020-11-21 07:10:00             🧑  作者: Mango
术语“ Lambda表达式”源自“ lambda”演算,后者又是用于定义函数的数学符号。 Lambda表达式作为LINQ方程的可执行部分,在运行时以某种方式转换逻辑,因此可以方便地传递到数据源。但是,lambda表达式不仅限于仅在LINQ中查找应用程序。
这些表达式由以下语法表示-
(Input parameters) ⇒ Expression or statement block
这是lambda表达式的示例-
y⇒y * y
上面的表达式指定了一个名为y的参数,并且y的值是平方的。但是,无法以这种形式执行lambda表达式。 C#中的lambda表达式示例如下所示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
delegate int del(int i);
static void Main(string[] args) {
del myDelegate = y ⇒ y * y;
int j = myDelegate(5);
Console.WriteLine(j);
Console.ReadLine();
}
}
}
Module Module1
Private Delegate Function del(ByVal i As Integer) As Integer
Sub Main(ByVal args As String())
Dim myDelegate As del = Function(y) y * y
Dim j As Integer = myDelegate(5)
Console.WriteLine(j)
Console.ReadLine()
End Sub
End Module
编译并执行以上C#或VB的代码时,将产生以下结果-
25
由于上述lambda表达式的语法中的表达式位于右侧,因此也称为表达式lambda。
通过使用async关键字合并异步处理而创建的lambda表达式称为异步lambda。以下是异步lambda的示例。
Func> getWordAsync = async()⇒ “hello”;
查询运算符的lambda表达式根据需要由同一个求值,并且可以连续处理输入序列中的每个元素,而不是整个序列。 Lambda表达式允许开发人员将自己的逻辑输入标准查询运算符。在下面的示例中,开发人员已使用“ Where”运算符通过使用lambda表达式从给定列表中回收了奇数值。
//Get the average of the odd Fibonacci numbers in the series...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
static void Main(string[] args) {
int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
Console.WriteLine(averageValue);
Console.ReadLine();
}
}
}
Module Module1
Sub Main()
Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()
Console.WriteLine(averageValue)
Console.ReadLine()
End Sub
End Module
编译并执行上述代码后,将产生以下结果-
7.33333333333333
在C#中,类型推断可在各种情况下方便地使用,并且也无需显式指定类型。但是,在使用lambda表达式的情况下,仅当指定了每种类型时,类型推断才会起作用,因为必须满足编译器的要求。让我们考虑以下示例。
delegate int Transformer (int i);
在这里,编译器利用类型推断来利用x是整数的事实,这是通过检查Transformer的参数类型来完成的。
在lambda表达式中使用变量作用域时有一些规则,例如在lambda表达式中初始化的变量在外部方法中不可见。还有一个规则是,除非引用引用该变量的委托有资格进行垃圾回收,否则不要对其进行垃圾回收。此外,有一条规则禁止lambda表达式内的return语句导致封闭方法的返回。
这是一个演示lambda表达式中变量范围的示例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
delegate bool D();
delegate bool D2(int i);
class Test {
D del;
D2 del2;
public void TestMethod(int input) {
int j = 0;
// Initialize the delegates with lambda expressions.
// Note access to 2 outer variables.
// del will be invoked within this method.
del = () ⇒ { j = 10; return j > input; };
// del2 will be invoked after TestMethod goes out of scope.
del2 = (x) ⇒ { return x == j; };
// Demonstrate value of j:
// The delegate has not been invoked yet.
Console.WriteLine("j = {0}", j); // Invoke the delegate.
bool boolResult = del();
Console.WriteLine("j = {0}. b = {1}", j, boolResult);
}
static void Main() {
Test test = new Test();
test.TestMethod(5);
// Prove that del2 still has a copy of
// local variable j from TestMethod.
bool result = test.del2(10);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
}
编译并执行上述代码后,将产生以下结果-
j = 0
j = 10. b = True
True
Lambda表达式广泛用于表达式树构造中。表达式树在数据结构中提供了类似于树的代码,其中每个节点本身就是一个像方法调用这样的表达式,或者可以是像x 也有由两个或三个语句组成的语句lambda ,但未在构造表达式树时使用。 return语句必须用lambda语句编写。 语句lambda的语法 编译并执行上述代码后,将产生以下结果- 在基于方法的LINQ查询中,Lambda被用作参数,并且决不允许像is或匿名方法那样在运算符的左侧放置位置。尽管Lambda表达式与匿名方法非常相似,但它们完全不受限制,只能用作委托。 Lambda表达式可以返回值,并且可以具有参数。 可以使用lambda表达式以多种方式定义参数。 如果在lambda表达式中只有一个语句,则不需要大括号,而如果有多个语句,则必须使用大括号和返回值。 使用lambda表达式,可以通过称为闭包的功能访问lambda表达式块外部的变量。应谨慎使用封闭,以避免出现任何问题。 无法在任何lambda表达式内执行任何不安全的代码。 Lambda表达式无意在运算符的左侧使用。声明Lambda
(params)⇒ {statements}
语句lambda的示例
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace lambdaexample {
class Program {
static void Main(string[] args) {
int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };
foreach (int i in source.Where(x ⇒
{
if (x <= 3)
return true;
else if (x >= 7)
return true;
return false;
}
))
Console.WriteLine(i);
Console.ReadLine();
}
}
}
3
8
1
7
9
2
8
使用Lambda表达式时要记住的要点