C# Lambda表达式

简介: 自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:Lambda表达式。只要有委托参数类型的地方,就可以使用Lambda表达式。

自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:Lambda表达式。只要有委托参数类型的地方,就可以使用Lambda表达式。

Lambda表达式的语法比匿名方法简单。如果所调用的方法有参数,且不需要参数,匿名方法的语法就比较简单,因为这样不需要提供参数。

直接上一些例子,读者可以自行运行调试。

        static void Main(string[] args)
        {
            //1、lambda之hello world.
            Func<string, string> lambda = param =>
            {
                return param;
            };

            Console.WriteLine(lambda("hello lambda."));

            //2、lambda之参数
            Func<double, double, double, double> cube = (double x, double y, double z) => x * y * z;
            Console.WriteLine(cube(1, 2, 3));//输出6

            //更进一步,参数的类型可以省略
            Func<double, double, double, double> cude1 = (x, y, z) => x * y * z;
            Console.WriteLine(cude1(2, 4, 6));//输出48

            //3、lambda之调用外部参数
            int someValue = 4;
            Func<double, double, double, double> f = (x, y, z) => x + y + z + someValue;
            Console.WriteLine(f(1, 2, 3));//1+2+3+4=10
        }
在winform编程中,我们经常给某个按钮添加Click事件,最原始的写法是直接双击按钮,生成Click事件的代码,我们就可以直接在里面写方法了。其实这是vs替我们做了很多工作,其中就有在designer.cs文件中,生成了 this.button1.Click += new System.EventHandler(this.button1_Click);这样的代码,事件要注册才能触发。

我们采用匿名委托的写法,在窗体的Form_Load事件中添加如下代码,则可以触发button1的Click事件。

            this.button1.Click += delegate(object ss, EventArgs ee)
            {
                MessageBox.Show("hello,this is button1.Click event...");
            };
再看看Lambda表达式的用法。

            this.button1.Click += (ss, ee) =>
            {
                MessageBox.Show("hello,this is button1.Click event...");
            };
是不是更加简洁?

我们再看一下,从匿名方法到Lambda简写的演化过程,借一张图。


从这个演化过程,可以看出C#语言的发展变化过程。

下面详细演示一下Lambda的应用实例。

首先第一个实例我们应用Lambda对一个List<Student>列表进行循环、查找、排序等操作。

首先我们提供一个实体类:

    public class Student
    {
        public Student(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }

        public string Name { get; set; }
        public int Age { get; set; }
    }
然后我们初始化一个List,

            //初始化3个Student对象
            var students = new List<Student>()
            {
                new Student("zhang3",18),
                new Student("li4",22),
                new Student("wang5",20)
            };
            //定义1个打印函数
            Action<Student> print = student => Console.WriteLine(string.Concat(student.Name, ":", student.Age));
那么,我们就可以先循环输出一下:

 students.ForEach(print);//循环打印输出

如果我们要找到年龄大于20岁的学生,可以这样:

 students.FindAll(student => student.Age > 20).ForEach(print);
进一步,我们按照学生的年龄进行排序:

            students.Sort((f1, f2) => f1.Age.CompareTo(f2.Age));
            students.ForEach(print);//年龄从小到大排序后输出

现在,我们按照在students列表里再加一个学生:

            var students = new List<Student>()
            {
                new Student("zhang3",18),
                new Student("li4",22),
                new Student("wang5",20),
                new Student("zhao6",20)
            };
现在要按照年龄进行分组,并统计出各个年龄阶段的人数:

            var result = students.GroupBy(x => x.Age).Select(x => string.Concat(x.Key, ":", x.Count()));//先进行分组,再进行投影
            result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//循环输出得到结果

再提供一个综合性的例子,这是论坛里的caozhy版主提供的一个例子。用Lambda表达式实现快速排序。

            Func<Func<int, int, bool>, Func<int[], int[]>> filter = x => new Func<int[], int[]>(y => y.Skip(1).Where(z => x(y[0], z)).ToArray());
            Func<int[], int[]> qsort = x => x;
            Func<int[], int[]> lesser = dt => filter((x, y) => y < x)(dt);
            Func<int[], int[]> greater = dt => filter((x, y) => y >= x)(dt);

            qsort = dt => dt.Length > 1
                ? qsort(lesser(dt)).Concat(new int[] { dt[0] }).Concat(qsort(greater(dt))).ToArray() : dt;

            int[] data = { 4, 3, 1, 4, 6, 7, 5, 9, 3, 11, 1, 2, 11 };
            var result = qsort(data);
            result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//排完序后输出

最后提供一下官方的C# Lambda表达式的权威资料。C# Lambda表达式

目录
相关文章
|
7月前
|
开发框架 .NET 编译器
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
|
3月前
|
开发框架 自然语言处理 .NET
C#一分钟浅谈:LINQ 查询表达式的使用技巧
【9月更文挑战第6天】LINQ(Language Integrated Query)是C#开发中的强大工具,使查询数据集合变得简单且接近自然语言。本文从基础入手,通过具体示例讲解LINQ查询表达式的使用技巧,包括过滤、排序和分组等操作。同时,文章还探讨了常见问题及解决方法,如性能优化、过早枚举和类型转换等,帮助开发者写出更高效、易维护的代码。
98 15
|
3月前
|
C#
C#一分钟浅谈:Lambda 表达式和匿名方法
本文详细介绍了C#编程中的Lambda表达式与匿名方法,两者均可用于定义无名函数,使代码更简洁易维护。文章通过基础概念讲解和示例对比,展示了各自语法特点,如Lambda表达式的`(parameters) =&gt; expression`形式及匿名方法的`delegate(parameters)`结构。并通过实例演示了两者的应用差异,强调了在使用Lambda时应注意闭包问题及其解决策略,推荐优先使用Lambda表达式以增强代码可读性。
48 8
|
5月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
7月前
|
C#
C#动态查询:巧用Expression组合多条件表达式
在C#中,利用`Expression`类和`AndAlso`、`OrElse`方法,可以组合两个`Expression&lt;Func&lt;T, bool&gt;&gt;`以实现动态多条件查询。该方法通过构建表达式树,方便地构建复杂查询。示例代码展示了如何创建表达式树,分别检查年龄大于等于18和姓名为&quot;John&quot;的条件,并使用`AndAlso`组合这两个条件,最终编译为可执行的委托进行测试。
276 1
|
7月前
|
SQL 开发框架 .NET
C#linq表达式的应用
C#linq表达式的应用
41 0
|
7月前
|
开发框架 .NET 编译器
C#学习相关系列之匿名方法和Lambda表达式
C#学习相关系列之匿名方法和Lambda表达式
|
7月前
|
开发框架 .NET 编译器
C# 9.0中的目标类型新表达式:类型推断的又一进步
【1月更文挑战第16天】C# 9.0引入了目标类型新表达式,这是类型推断功能的一个重要扩展。通过目标类型新表达式,开发者在创建对象时可以省略类型名称,编译器会根据上下文自动推断所需类型。这一特性不仅简化了代码编写,还提高了代码的可读性和维护性。本文将详细介绍目标类型新表达式的语法、使用场景及其对C#编程的影响。
|
7月前
|
机器学习/深度学习 开发框架 .NET
C# 中的 Lambda 表达式:一种简洁而强大的编程工具
【1月更文挑战第6天】在现代编程中,Lambda 表达式已经成为一种非常流行的编程范式。C# 作为一种功能强大的、面向对象的编程语言,自然也不例外。Lambda 表达式在 C# 中提供了一种简洁、灵活的方式来表示匿名函数。这些函数可以被用作委托或表达式树类型,从而在各种不同的上下文中使用。
|
27天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
32 3