开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# lambda 表达式

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的SelectWhere方法中使用了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#教程。

未经允许不得转载:我爱分享网 » C# lambda 表达式

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏