了解C#中Lambda表达式的用法

Lambda表达式是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。

1、Lambda来源

1920年到1930年期间,数学家Alonzo Church等人发明了Lambda积分。Lambda积分是用于表示函数的一套系统,它使用希腊字母Lambda(λ)来表示无名函数。近年来,函数式编程语言(如Lisp)使用这个术语来表示可以直接描述函数定义的表达式,表达式不再需要有名字。

2、Lambda表达式

Lambda表达式是C# 3.0/.NET 3.x 新增特性,Lambda表达式的语法由Lambda运算符和左边的参数部分以及右边的Lambda主体构成。

如下图,

例如,

复制代码
using System;
class ListSort
{
    static void Main()
    {
        int[] nums = { 3, 6, 8, 1, 2, 9 };
        //使用匿名方法实现 Comparison
        Array.Sort(nums, delegate (int i, int j) {
            if (i == j)                       // 这个接口的返回值为 1 0 -1. 用来实现排序
            {                               // 这里是倒序排列
                return 0;    //相等 返回 0
            }
            else if (i < j)
            {
                return 1;
            }
            else
                return -1;
        });
        foreach (int i in nums)
            Console.Write(i + ",");
        Console.WriteLine();
        nums = new int[] { 13, 16, 18, 11, 12, 19 };
        //使用lambda实现 Comparison
        Array.Sort(nums, (int i, int j) => {  //使用匿名方法实现 Comparison
            if (i == j)                       // 这个接口的返回值为 1 0 -1. 用来实现排序
            {                               // 这里是倒序排列
                return 0;    //相等 返回 0
            }
            else if (i < j)
            {
                return 1;
            }
            else
                return -1;
        });
        foreach (int i in nums)
            Console.Write(i + ",");
        Console.WriteLine();
        nums = new int[] { 23, 26, 28, 21, 22, 29 };
        //使用定义方法实现 Comparison
        Array.Sort(nums, CompareValue);
        #region output
        foreach (int i in nums)
            Console.Write(i + ",");
        Console.WriteLine();
        #endregion
    }
    private static int CompareValue(int i, int j)
    {
        if (i == j)                       // 这个接口的返回值为 1 0 -1. 用来实现排序
        {                               // 这里是倒序排列
            return 0;    //相等 返回 0
        }
        else if (i < j)
        {
            return 1;
        }
        else
            return -1;
    }
}

注意:

1)Lambda表达式中的参数列表(参数数量、类型和位置)必须与委托相匹配;

2)表达式中的参数列表不一定需要包含类型,除非委托有ref或out关键字(此时必须显示声明);

3)如果没有参数,必须使用一组空的圆括号;

3、Lambda发展过程

从最开始委托匿名方法,发展到Lambda表达式,只是更方便了,本质是相同的。方法和委托等者是编译器帮我们声明定义了。变化过程如下图,

4、Lambda 语句和Lambda 表达式区别

Lambda表达式有两种类型:一是Lambda表达式,二是语句Lambda。语句Lambda 和 表达式Lambda 的区别在于,前者在 =>右边有一个语句块(大括号),而后者只有一个表达式(没有return 和大括号)。

例如,

复制代码
//Lambda 语句
Action<string> greet = name =>
{
    string greeting = $"Hello {name}!";
    Console.WriteLine(greeting);
};
greet("World");
//Lambda 表达式
Func<double, double> cube = x => x * x * x;
Console.WriteLine(cube(2))
相关推荐
阿里嘎多学长4 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
布吉岛的石头5 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!5 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc6 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
昂好的day7 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
努力实干8 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
NetX行者9 小时前
四语言 Hello World 背后:编译模型与运行时对比
开发语言
波力海苔夹心脆67510 小时前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
Pin_Qing10 小时前
账单没超,请求先被拒了
大数据·开发语言·人工智能
2601_9628857210 小时前
如何用 Python 计算 VaR 和 CVaR(在险价值)?
开发语言·python