当前位置 : 主页 > 网络编程 > c#编程 >

C#中的匿名函数、lambda表达式解读

来源:互联网 收集:自由互联 发布时间:2023-03-22
目录 C# 匿名函数、lambda表达式、Linq查询 一、匿名函数的使用 二、lambda表达式 总结 C# 匿名函数、lambda表达式、Linq查询 一、匿名函数的使用 匿名函数是一个内联语句或表达式,可在需
目录
  • C# 匿名函数、lambda表达式、Linq查询
    • 一、匿名函数的使用
    • 二、lambda表达式
  • 总结

    C# 匿名函数、lambda表达式、Linq查询

    一、匿名函数的使用

    匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用。

    可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数。

    下面的示例演示了从 C# 1.0 到 C# 3.0 委托创建过程的发展:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test0630
    {
        delegate void TestDelegate(string s);
        class Program
        {
            static void Main(string[] args)
            {
                // Original delegate syntax required 
                // initialization with a named method.
                TestDelegate testDelA = new TestDelegate(M);
    
                // C# 2.0: A delegate can be initialized with
                // inline code, called an "anonymous method." This
                // method takes a string as an input parameter.
                TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };
    
                // C# 3.0. A delegate can be initialized with
                // a lambda expression. The lambda also takes a string
                // as an input parameter (x). The type of x is inferred by the compiler.
                TestDelegate testDelC = (x) => { Console.WriteLine(x); };
    
                // Invoke the delegates.
                testDelA("Hello,this is TestA");
                testDelB("Hello,this is TestB");
                testDelC("Hello,this is TestC");
    
                // Keep console window open in debug mode.
                Console.WriteLine("Press any key to exit.");
                Console.ReadKey();
            }
    
    
            static void M(string s)
            {
                Console.WriteLine(s);
            }
        }
    }

    二、lambda表达式

    lambda表达式是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量,是LINQ的基础。

    lambda表达式格式:(参数列表)=>表达式或语句块 ,举例如下:

    //无参
    () => DoSomeThing() ;
    
    //单参数
    p => p.id > 0 ; //返回Bool
    
    //多参数
    ( x , y ) => x * y ;
    
    //带类型输入参数
    ( int x , int y ) => x * y;

    下面介绍List集合中的Lambda表达式的运用:

    (1) 查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储

    var list1001=Studentlist.Where(t=>t.ClassCode==‘1001');

    (2) 查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储,并按照学生的出生日期从小到大排列。

    var list1001=Studentlist.Where(t=>t.ClassCode==‘1001').OrderBy(t=>t.BirthDay);

    在此说一下,OrderBy是从小到大排序,需要从大到小排列则用OrderByDescending。

    (3) 查询班级编号为1001的班级下面的姓氏为【李】的同学的所有集合,并按照学生的出生日期从小到大排列。

    var list1001=Studentlist.Where(t=>t.ClassCode==‘1001'&&t.StudentName.StartWith(“李”)).OrderBy(t=>t.BirthDay);

    (4) 查询出班级编号为1001的班级,并且存在至少一门考试科目成绩低于60分的所有同学。

    var result = studentList.Where(t => (t.ClassCode == "1001") && (scoreList.Exists(p => p.ScoreValue < 60 && p.StudentCode == t.StudentCode)));

    (5) 其他较常用的Lambda表达式如下:

    var a = studentList.FirstOrDefault(t => t.StudentCode == "10012");//FirstOrDefault返回第一个符合条件的数据,不存在的时候返回Null。
    var b = studentList.Count(t => t.StudentName == "李世民");//返回符合条件的实体个数
    var c = studentList.FindAll(t => t.StudentName.Contains("中"));//查找所有名字中含有【中】的实体集合
    var d = studentList.GroupBy(t => t.ClassCode);//对studentList按照ClassCode分组
    var f = studentList.Max(t => t.BirthDay);//返回最大的出生日期。
    var e = scoreList.Sum(t => t.ScoreValue);//对所有成绩求和
    var g = scoreList.Average(t => t.ScoreValue);//对所有成绩求平均分
    var h = studentList.Select(t => t.StudentName).Distinct();//获取所有的学生姓名,并去除重名

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

    上一篇:C#cefSharep控件的使用详情
    下一篇:没有了
    网友评论