博客
关于我
Lambda表达式详解
阅读量:794 次
发布时间: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/

    你可能感兴趣的文章
    layer.msg is not a function
    查看>>
    Laykefu客服系统 任意文件上传漏洞复现
    查看>>
    Layout Team
    查看>>
    layout_weight 的解释及使用
    查看>>
    Layui 字段集区块、面板和Tab选项卡
    查看>>
    LayUI 数据表格学习和应用(IT枫斗者)
    查看>>
    layui 表单元素
    查看>>
    layui 表单提交不执行ajax的坑
    查看>>
    LayUI02之动态树
    查看>>
    layui上传文件、图片
    查看>>
    layui中如何让多个控件在一行显示
    查看>>
    layui中的table模块中的基础参数应用
    查看>>
    LayUI之CRUD
    查看>>
    LayUI之动态选项卡Tab&iframe使用
    查看>>
    LayUI动态树 案例
    查看>>
    layui图标使用和自定义矢量库图标
    查看>>
    layui实现多图上传方法
    查看>>
    layui插件croppers的使用
    查看>>
    layui数据表格自定义每页条数limit设置
    查看>>
    layui框架使用与代码编写
    查看>>