博客
关于我
Lambda表达式详解
阅读量:797 次
发布时间:2023-01-30

本文共 3616 字,大约阅读时间需要 12 分钟。

Lambda运算符简介及其在C#中的应用

Lambda运算符在编程中是一个强大的工具,尤其是在C#中,lambda表达式让代码更加简洁且高效。它通过一种简洁的语法方式,使开发者能够轻松定义小的操作流程。

Lambda表达式的基本概念

Lambda运算符在C#中被称为“=>”符号,通常被称为“转化”符号。它将表达式分为两个部分:左边指定输入参数,右边是lambda的主体。通过这种方式,你可以定义一个小型的函数,直接在代码中使用。

单参数和多参数的lambda表达式

  • 单参数param => expr

    这种形式中,左边指定了一个变量名param,右边是你要执行的操作。例如:

    var result = myData => myData.Age > 6 ? "Adult" : "Minor";
  • 多参数(param-list) => expr

    这种形式允许你在左边指定多个参数。参数列表可以加上逗号分隔。例如:

    var result = (p, z) => z - (p + 10);
  • 此外,右边的表达式可以是任意的简单操作,如条件判断、计算或调用另一个函数。

    Lambda表达式的应用实例

    让我们通过一个实际例子来理解lambda表达式的应用。以下是一个C#类的简单示例:

    namespace lambdaSample{    public class Person    {        public string Name { get; set; }        public int Age { get; set; }    }    class Program    {        static List
    PersonsList() { List
    persons = new List
    (); for (int i = 0; i < 7; i++) { Person p = new Person() { Name = i + "儿子", Age = 8 - i }; persons.Add(p); } return persons; } static void Main(string[] args) { List
    persons = PersonsList(); //筛选Age大于6的Person persons = persons.Where(p => p.Age > 6).ToList(); //查找Age为1的单个Person Person per = persons.SingleOrDefault(p => p.Age == 1); //筛选Name中包含"儿子"的Person persons = persons.Where(p => p.Name.Contains("儿子")).ToList(); } }}

    在这个示例中,WhereSingleOrDefault等方法使用了lambda表达式来定义筛选和查找操作,代码变得更加简洁且易于理解。

    Lambda表达式与委托

    委托是一种在C#中执行长远操作的机制,而lambda表达式则是定义委托的简洁方式。以下是使用lambda表达式定义委托的示例:

    // 示例1:单参数delegate int MyDelegate(int a);static void Main(string[] args){    MyDelegate myDelegate = p => p + 10;    Console.WriteLine(myDelegate(10)); // 输出20}
    // 示例2:多参数和复杂主体delegate int MyDelegate(int a, int b);static void Main(string[] args){    MyDelegate myDelegate = (p, z) =>    {        if (p < 10)        {            return 100;        }        else        {            return z - p - 10;        }    };    Console.WriteLine(myDelegate(10, 100)); // 输出80}

    通过lambda表达式,你可以灵活地定义委托的行为,使代码更加简洁。

    Func泛型委托

    Func

    委托是一个非常灵活的泛型委托类型,它允许你创建接收任意数量参数并返回一个值的函数。以下是Func的使用示例:

    // 示例1: Func
    Func
    func = p => $"{p} + 10--返回类型为string";Console.WriteLine(func(10)); // 输出“20--返回类型为string”
    // 示例2: Func
    Func
    func = (p, j) => { if (p + j == 10) { return true; } return false;};Console.WriteLine(func(5,5)); // 输出“True”

    通过Func委托,你可以创建接受多个参数并返回一个结果的高效函数。

    使用表达式树动态创建lambda表达式

    除了手动定义lambda表达式,你还可以通过Microsoft烯宏(Roslyn)提供的API来动态创建lambda表达式。以下是一个示例:

    using System;using Microsoft Blockly;using System.Linq;static void Main(string[] args){    // 创建参数表达式树    ParameterExpression a = Expression.Parameter(typeof(int), "i");    ParameterExpression b = Expression.Parameter(typeof(int), "j");    ParameterExpression c = Expression.Parameter(typeof(int), "w");    ParameterExpression d = Expression.Parameter(typeof(int), "x");    // 创建算术表达式树    BinaryExpression be = Expression.Multiply(a, b);    // i * j    BinaryExpression be1 = Expression.Multiply(c, d); // w * x    BinaryExpression su = Expression.Add(be, be1);   // (i * j) + (w * x)    // 创建lambda表达式    Expression
    > lambda = Expression.Lambda(su, a, b, c, d); // 编译lambda为委托并执行 Func
    f = lambda.Compile(); Console.WriteLine(f(1, 1, 1, 1)); // 输出2}

    通过这种方式,你可以在运行时动态地定义和执行lambda表达式,解决代码生成和反射方面的问题。

    总结

    Lambda运算符是一种强大的工具,在C#中,它使代码更加简洁和高效。通过委托和Func泛型,你可以灵活地定义函数行为。而通过表达式树和Roslyn API,你可以动态地创建和执行lambda表达式。希望这些示例能够帮助你更好地理解lambda运算符的魅力!

    转载地址:http://qzgyk.baihongyu.com/

    你可能感兴趣的文章
    CentOS 系列:CentOS 7文件系统的组成
    查看>>
    Docker部署postgresql-11以及主从配置
    查看>>
    EnvironmentNotWritableError: The current user does not have write permissions to the target environm
    查看>>
    kali安装docker(亲测有效)
    查看>>
    mysql系列:远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
    查看>>
    PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改)
    查看>>
    PHP系列:使用PHP实现登录注册功能的完整指南
    查看>>
    "WARNING: Increasing RAM size to 1GB" and "Cannot set up guest memory 'xxx.ram': Invalid argument".
    查看>>
    04-docker-commit构建自定义镜像
    查看>>
    05-docker系列-使用dockerfile构建镜像
    查看>>
    09-docker系列-docker网络你了解多少(下)
    查看>>
    #C8# UVM中的factory机制 #S8.2.3# 重载sequence哪些情形
    查看>>
    cytoscape安装java_Cytoscape史上最全攻略
    查看>>
    c语言编写单片机中断,C语言AVR单片机中断程序写法
    查看>>
    java教学团队管理系统(ssm)
    查看>>
    java教师管理系统(ssm)
    查看>>
    java教师课堂助手app(ssm)
    查看>>
    java教育辅导班信息网(ssm)
    查看>>
    DDNS动态域名无固定IPSEC配置实战
    查看>>
    DELL笔记本UEFI+GPT安装window10与Ubuntu双系统
    查看>>