文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-01-28 06:09

关注

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();//获取所有的学生姓名,并去除重名

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯