C#lambda表达式教程展示了如何在C#中使用lambda表达式。C#教程是C#语言的综合教程。
lambda表达式是一个未绑定到标识符的匿名函数。使用lambda表达式,我们可以创建更简洁的代码。
lambda表达式有两种形式:
(input-parameters) => expression
这个表单有一个表达式作为它的主体。
(input-parameters) => { <sequence-of-statements> }
这个表单有一个语句块作为它的主体。
C#lambda表达式简单例子
以下是一个使用lambda表达式的简单示例。
Func<int, int> square = x => x * x; Func<int, int> cube = x => x * x * x; Func<int, int> inc = x => x++; Func<int, int, int> add = (x, y) => x + y; Console.WriteLine(square(5)); Console.WriteLine(cube(5)); Console.WriteLine(inc(5)); Console.WriteLine(add(5, 7));
在示例中,我们定义了四个函数。
Func<int, int> square = x => x * x;
Func
委托引用一个lambda表达式,它对输入值进行平方。这是其他语言中最接近普通函数的等价物。
$ dotnet run 25 125 5 12
C#lambda语句
lambda语句可以有多个语句,这些语句括在{}
大括号中。
Action<string> greet = name => { string greeting = $"Hello {name}!"; Console.WriteLine(greeting); }; greet("Pau"); greet("Lucia");
在示例中,我们使用了一个Action
委托。在等式的右边,我们有一个lambda语句,它由两个语句组成。Action
委托接受一个输入参数并且不返回任何内容。
$ dotnet run Hello Pau! Hello Lucia!
带数组的C#lambda表达式
在以下示例中,我们使用数组。
int[] vals = { 1, -2, 3, 4, 0, -3, 2, 1, 3 }; var v1 = Array.FindIndex(vals, x => x == 3); Console.WriteLine(v1); var v2 = Array.FindLastIndex(vals, x => x == 3); Console.WriteLine(v2); var positive = Array.FindAll(vals, x => x > 0); Console.WriteLine(string.Join(",", positive));
数组函数需要一个谓词函数,它适用于数组的所有元素。
var positive = Array.FindAll(vals, x => x > 0);
我们将lambda表达式作为第二个参数传递给FindAll
方法;该表达式是一个谓词,对于大于零的值返回真。
$ dotnet run 2 8 1,3,4,2,1,3
使用LINQ的C#lambda表达式
我们可以在许多LINQ方法中使用lambda表达式。
var vals = new List<int> { -1, 2, -2, 0, 3, 4, -5 }; var squared = vals.Select(x => x * x); Console.WriteLine(string.Join(", ", squared)); var filtered = vals.Where(x => x > 0); Console.WriteLine(string.Join(", ", filtered));
在示例中,我们在LINQ的Select
和Where
方法中使用了lambda表达式。
$ dotnet run 1, 4, 4, 0, 9, 16, 25 2, 3, 4
C#lambda表达式数组
在下面的示例中,我们创建了一个lambda表达式数组。
var funs = new Func<int, int>[] { x => x * x, x => ++x, x => --x }; for (int i=0; i<6; i++) { Console.WriteLine(funs[0](i)); Console.WriteLine(funs[1](i)); Console.WriteLine(funs[2](i)); Console.WriteLine(); }
在示例中,我们将三个lambda表达式放在一个数组中。然后在forloop中,我们将整数0..5传递给三个lambda表达式。
C#lambda表达式丢弃
从C#9.0开始,我们可以使用丢弃符(_)作为lambda和匿名方法的参数。
using System.Windows.Forms; using System.Drawing; namespace QuitButton { class MyForm : Form { private FlowLayoutPanel flowPanel; public MyForm() { InitComponents(); } private void InitComponents() { Text = "Quit button"; ClientSize = new Size(800, 450); flowPanel = new FlowLayoutPanel(); flowPanel.Dock = DockStyle.Fill; flowPanel.BorderStyle = BorderStyle.FixedSingle; var button = new Button(); button.Margin = new Padding(10, 10, 0, 0); button.Text = "Quit"; button.AutoSize = true; button.Click += (_, _) => Close(); flowPanel.Controls.Add(button); Controls.Add(flowPanel); CenterToScreen(); } [STAThread] static void Main() { Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.Run(new MyForm()); } } }
该示例是一个使用Winforms创建的简单GUI应用程序;它仅适用于Windows。
button.Click += (_, _) => Close();
因为我们不使用发送者对象和事件参数,所以我们可以使用丢弃。
在本文中,我们使用了C#中的lambda表达式。
列出所有C#教程。