C#基础之Lambda表达式用法实例教程

作者:shichen2014 时间:2021-12-06 14:07:56 

本文以实例形式介绍了C#中Lambda表达式的用法,分享给大家供大家参考之用。具体如下:

从委托的角度来看,Lambda表达式与匿名方法没有区别。在前面C#基础之匿名方法一文中,我们使用了匿名方法来调用List<T>的FindAll方法。从C# 3.0开始,在使用匿名方法的地方,完全可以用Lambda表达式来代替。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有相同优先级的右结合运算符,在英语里读作:“goes to”。

现在回过头来看我们的例子。下面的代码与之前C#基础之匿名方法一文中的代码具有相同的效果:


class Program
{
static void Main(string[] args)
{
List<string> names = new List<string>();
names.Add("Sunny Chen");
names.Add("Kitty Wang");
names.Add("Sunny Crystal");

List<string> found = names.FindAll
 (
 // Lambda Expression Implementation
 name => name.StartsWith(
 "sunny",
 StringComparison.OrdinalIgnoreCase)
 );

if (found != null)
{
 foreach (string str in found)
 Console.WriteLine(str);
}
}
}

上面的Lambda Expression Implementation在效果上与匿名方法没有任何区别,“=>”左边的name定义了参数(当参数个数为1的时候,圆括号可以省略),“=>”右边定义执行体。由于C# 3.0编译器具有Type Inference的能力,参数类型与返回值都将由编译器通过上下文判定,因此与匿名方法不同,Lambda表达式的参数可以不给定参数类型。当所表示的匿名方法没有任何参数时,Lambda表达式也同样可以使用,只需在“=>”左边用一对圆括号表示即可。即:


() => Console.WriteLine("Hello!");

事实上,“Lambda表达式”这一词比较笼统,事实上“=>”运算符既可以表示Lambda表达式,也可以表示Lambda语句。Lambda语句由代码块组成,形式上很像匿名方法。请看下面的例子:


class Program
{
static void Main(string[] args)
{
// Lambda 表达式
Func<int, bool> dele1 = n => n > 10;
// Lambda 语句
Func<int, bool> dele2 = (int n) => { return n > 10; };
Console.WriteLine(dele1(16));
Console.WriteLine(dele1(8));
}
}

两种定义方法同样可以正确地输出结果。请注意,当我们希望构建表达式树的时候,情况却完全不同了:


// ok
Expression<Func<int, bool>> expr1 = n => n > 10;
// error: cannot converted to an expression tree
Expression<Func<int, bool>> expr2 = (int n) => { return n > 10; };

由此可见,在构建表达式树的时候,不能用Lambda语句(带有代码语句的Lambda表达式),而应该使用Lambda表达式。从这里就可以看出匿名方法与Lambda表达式的区别了。

相信本文所述对大家C#程序设计的学习有一定的借鉴价值。

标签:C#,Lambda
0
投稿

猜你喜欢

  • Java详解IO流创建读取与写入操作

    2023-01-23 01:50:28
  • Java中BufferedReader和BufferedWriter使用方式

    2022-01-06 15:06:05
  • 详解springboot springsecuroty中的注销和权限控制问题

    2023-04-05 15:09:51
  • 通过自定制LogManager实现程序完全自定义的logger

    2022-05-11 06:33:15
  • 如何利用泛型封装通用的service层

    2023-05-15 04:55:43
  • Java中的this和super实例浅析

    2023-03-03 13:24:09
  • 用Java程序判断是否是闰年的简单实例

    2022-10-13 23:04:30
  • jdk线程池的实现

    2023-07-05 18:44:35
  • SpringBoot2.0解决Long型数据转换成json格式时丢失精度问题

    2022-10-31 16:56:24
  • Spring AOP实现功能权限校验功能的示例代码

    2021-10-18 21:32:29
  • c# 遍历 Dictionary的四种方式

    2023-04-17 13:11:10
  • 浅谈Java线程Thread之interrupt中断解析

    2023-07-19 09:25:11
  • 详解Asp.Net MVC的Bundle捆绑

    2021-09-10 05:21:38
  • SpringBoot错误处理机制以及自定义异常处理详解

    2021-09-23 05:45:29
  • JAVA实现账户取款和存款操作

    2023-08-22 16:31:45
  • idea中的Maven导包失败问题解决方案汇总

    2023-07-12 12:34:22
  • Android WindowManger的层级分析详解

    2023-08-05 23:51:40
  • java多线程加锁以及Condition类的使用实例解析

    2023-08-07 07:25:30
  • SpringBoot整合Web开发之Json数据返回的实现

    2023-04-27 05:06:51
  • Unity打包代码到DLL的实现

    2022-06-28 08:38:17
  • asp之家 软件编程 m.aspxhome.com