C# Lambda 表达式是一段接受参数并返回值的简短代码块。它被定义为一个匿名函数(没有名称的函数)。例如,
num => num * 7
在这里,num
是一个输入参数,num * 7
是一个返回值。Lambda 表达式本身不执行。相反,我们在其他方法或变量中使用它。
下面让我们详细了解 Lambda 表达式。
如何定义 Lambda 表达式
我们可以在 C# 中将 Lambda 表达式定义为:
(parameterList) => lambda body
这里,
parameterList
- 输入参数列表=>
- Lambda 运算符lambda body
- 可以是表达式或语句
根据 Lambda 主体,C# Lambda 表达式分为两种类型。
Lambda 表达式的类型
Lambda 表达式的两种类型是
- 表达式 Lambda
- 语句 Lambda
1. 表达式 Lambda: 表达式 Lambda 在 Lambda 主体中包含单个表达式。例如,
(int num) => num * 5;
上面的表达式 Lambda 在 Lambda 主体中包含单个表达式 num * 5
。它接受一个 int
输入,将其乘以 5,然后返回输出。
2. 语句 Lambda: 语句 Lambda 在 Lambda 主体中包含一个或多个语句。我们使用大括号 {}
来包装语句。例如,
(int a, int b) =>
{
var sum = a + b;
return sum;
};
上面的表达式是一个语句 Lambda,它在 Lambda 主体中包含两个语句。它接受两个 int
输入并返回它们的和。
让我们通过示例来清楚地了解 C# Lambda。
示例:C# 表达式 Lambda
using System;
class Program
{
static void Main()
{
// expression lambda that returns the square of a number
var square = (int num) => num * num;
// passing input to the expression lambda
Console.WriteLine("Square of number: " + square(5));
}
}
输出
Square of number: 25
在上面的示例中,表达式 Lambda 是
(int num) => num * num;
在这里,表达式 Lambda 返回 num
的平方。然后我们将表达式 Lambda 赋值给 square
变量。
因此,当我们传递 5 作为 square
的输入时,我们得到 25 作为输出。
示例:C# 语句 Lambda
using System;
class Program
{
static void Main()
{
// statement lambda that takes two int inputs and returns the sum
var resultingSum = (int a, int b) =>
{
int calculatedSum = a + b;
return calculatedSum;
};
// find the sum of 5 and 6
Console.WriteLine("Total sum: " + resultingSum(5, 6));
}
}
输出
Total sum: 11
在上面的示例中,我们使用了语句 Lambda:
(int a, int b) =>
{
int calculatedSum = a + b;
return calculatedSum;
}
在这里,语句 Lambda 接受两个整数参数 - a
和 b
。在 Lambda 运算符 =>
的右侧,我们包含了两个语句,它们
- 计算
a
和b
的和 - 返回和
注意: 在 C# 9.0 之前,在使用 var
和 Lambda 表达式时,必须显式定义委托类型。C# 9.0 引入了在不指定委托类型的情况下将 Lambda 表达式赋值给 var
的功能。
带有委托的 Lambda 表达式
在 C# 中,我们可以将 Lambda 表达式赋值给像 Func
这样的委托类型。例如,
using System;
class Program
{
static void Main()
{
// using lambda expression with delegate type
// take an int input, multiply it with 3 and return the result
Func<int, int> multiply = num => num * 3;
// calls multiply() by passing 5 as an input
Console.WriteLine(multiply(5));
}
}
输出
15
在上面的示例中,我们将 Lambda 表达式 num => num * 3;
赋值给了 Func
委托 multiply
。
在这里,Lambda 表达式接受一个 int
类型的输入 num
,将其乘以 3,并将结果返回给 multiply()
。
因此,当我们向 multiply()
传递 5 时,它返回 15。
注意: Func<>
委托类型接受 0 个或多个输入值并返回一个输出值。例如,Func<int,int,string>
接受两个 int
输入并返回一个 string
输出。要了解更多关于委托的信息,请访问 C# 委托。
Lambda 表达式的用途
Lambda 表达式的一些用途是
1. 编写简单易懂的委托代码
使用 Lambda 表达式,我们可以编写更简单易懂的代码。让我们看看在委托中使用 Lambda 表达式和不使用 Lambda 表达式的程序。
不使用 Lambda 表达式的程序
using System;
class Program
{
static void Main()
{
// method that returns square of a number
int Square(int num)
{
return num * num;
}
// delegate that points the Square() method
Func<int, int> square = Square;
// calling square() delegate
Console.WriteLine(square(7));
}
}
输出
49
在上面的程序中,我们定义了一个指向 Square()
方法的 Func
类型的委托 square
。
使用 Lambda 表达式的程序
using System;
class Program
{
static void Main()
{
// delegate using lambda expression
Func<int, int> square = num => num * num;
// calling square() delegate
Console.WriteLine(square(7));
}
}
输出
49
在这里,我们无需定义单独的方法。我们用 Lambda 表达式替换了指向 square()
方法的指针。
2. 将参数传递给方法
我们可以将 Lambda 表达式作为参数传递给方法调用。
让我们以 C# 数组的内置 Count()
方法为例,并将 Lambda 表达式作为其参数传递。
using System;
class Program
{
static void Main()
{
// array containing integer values
int[] numbers = { 2, 13, 1, 4, 13, 5 };
// lambda expression as method parameter
// returns the total count of 13 in the numbers array
int totalCount = numbers.Count(x => x == 13);
Console.WriteLine("Total number of 13: " + totalCount);
}
}
输出
Total number of 13: 2
在上面的示例中,我们将 Lambda 表达式 x => x == 13
作为方法参数传递。
Count()
方法会检查 numbers 数组的每个元素,并计算数组中 13 的总数。