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

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

在C#中,匿名函数和lambda表达式提供了更强大、更简洁的代码实现方式,这两个概念通常都是一起出现的。

匿名函数

匿名函数就是没有名字的函数,在C#中可以使用delegate来定义。匿名函数主要有以下两种形式:

delegate (parameters) { statements }
delegate { statements }

第一种形式的匿名函数,可以像普通函数一样传递参数和返回值。例如:

Action<int> printInt = delegate (int a) { Console.WriteLine(a); };
printInt(3); // 输出 3

第二种形式的匿名函数不需要传递参数和返回值。例如:

Action greet = delegate { Console.WriteLine("Hello"); };
greet(); // 输出 Hello

Lambda表达式

Lambda表达式是一种精简版的匿名函数,通常是以=>符号分割的参数列表和执行代码体组成。

(parameters) => expression
(parameters) => { statements }

Lambda表达式同样支持传递参数和返回值。例如:

Action<int> printInt = a => Console.WriteLine(a);
printInt(3); // 输出 3
Func<int, int> square = x => x * x;
Console.WriteLine(square(3)); // 输出 9

Lambda表达式也可以在LINQ查询语句中使用,实现快速筛选和排序等操作。例如:

var nums = new List<int> { 3, 6, 1, 8, 2 };
var sortedNums = nums.OrderBy(x => x);
Console.WriteLine(string.Join(", ", sortedNums)); // 输出 1, 2, 3, 6, 8

Lambda表达式还可以与委托、事件等高级概念相结合,进一步提升C#编程效率和代码可读性。

示例说明

示例1:按照姓氏首字母排序

例如有一个Person类:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

现在需要按照每个人的姓氏首字母进行升序排序。可以使用LINQ和Lambda表达式来实现:

var people = new List<Person>
{
    new Person("Tom Smith", 27),
    new Person("Alice Johnson", 31),
    new Person("Bob Wilson", 22),
    new Person("John Doe", 35)
};

var sortedPeople = people.OrderBy(p => p.Name.Split()[1][0]);

foreach (var person in sortedPeople)
{
    Console.WriteLine(person.Name);
}

只需要一行代码就可以实现排序功能。使用OrderBy方法和Lambda表达式,将每个Person的Name属性拆成两个部分:FirstName和LastName。通过姓氏的首字母进行升序排列。

示例2:计算数组中奇数的数量

例如有一个整数数组:

var nums = new[] { 3, 6, 1, 8, 2 };

现在需要计算这个数组中奇数的数量。可以使用Lambda表达式和Count方法来实现:

var oddCount = nums.Count(n => n % 2 != 0);
Console.WriteLine("Odd count: " + oddCount);

只需要一行代码就可以完成计算功能。使用Count方法和Lambda表达式,筛选出数组中为奇数的元素,并统计数量。

以上两个示例展示了匿名函数和Lambda表达式的一些基本应用方式,并且与其他C#高级概念结合实现了不同的功能。通过这些示例,可以更好地理解这两个概念的使用方法和实现原理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中的匿名函数、lambda表达式解读 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • EF Core从TPH迁移到TPT

    Intro EF Core支持多种方式处理具有继承关系的表,现在支持TPH、TPC(EF Core 7)、TPT,具体的实现方式可以参考官方文档和这篇文章。 大致总结一下不同的方式的区别:TPH:所有的类型都放在一张表中,使用discriminator字段用以区别不同的类型TPT:不同的子类型有单独的表存放子类独有的字段,父虚类型也有一张单独的表存放共有的字…

    C# 2023年4月18日
    00
  • C#用委托BeginInvoke做异步线程

    下面是C#用委托BeginInvoke做异步线程的完整攻略: 委托和异步线程 委托(Delegate)是C#中非常重要的概念之一。它是一种类型,允许我们在定义方法的时候,把该方法的引用传递给其他的方法,这样其他的方法就可以“调用”该方法了。委托本身就是一个指针,只不过是用来指向方法的,因此有时候也称之为“方法指针”。 异步线程指的是,我们在执行某些任务时,不…

    C# 2023年6月7日
    00
  • asp.net+js实时奥运金牌榜代码第1/2页

    asp.net+js实时奥运金牌榜是一项基于ASP.NET和JavaScript技术的开发项目,可以实时监控奥运会金牌榜的变化并显示在网页上,该项目具有较高的实用性,适用于体育比赛等大型赛事开发。以下是该项目的详细攻略: 环境搭建 安装Visual Studio 安装IIS服务器 创建Web应用项目 技术实现 HTML HTML部分主要用于页面结构的搭建,使…

    C# 2023年5月31日
    00
  • C#实现学生成绩管理系统

    C#实现学生成绩管理系统 介绍 学生成绩管理系统是一种常见的应用,它提供了学生信息录入、成绩查阅等功能,方便教师和学生进行学习管理。C#是一种面向对象的编程语言,非常适合实现这种应用。 本文将介绍如何使用C#实现一个简单的学生成绩管理系统。我们将使用Visual Studio开发环境来快速构建应用。本系统将支持学生信息的录入、成绩的添加、修改和删除,以及成绩…

    C# 2023年6月7日
    00
  • JWT.net 操作实践方法

    JWT.net 操作实践方法 JSON Web Token(JWT)是一种基于JSON格式的Web Token标准,用于在不信任的环境下对用户进行身份验证和授权。JWT.net是一个C#中的JWT实现库,本篇文章将介绍如何使用JWT.net进行JWT生成、验证、签名等操作。 安装 可以通过NuGet包管理器或者命令行安装JWT.net: Install-Pa…

    C# 2023年5月31日
    00
  • JavaScript面向对象分层思维全面解析

    下面我将和您详细讲解“JavaScript面向对象分层思维全面解析”的完整攻略。 什么是JavaScript面向对象分层思维 JavaScript面向对象分层思维是一种针对JavaScript编程语言的面向对象设计模式。它将对象分为三个层次:业务层、数据层和界面层。每个层次都有自己独特的对象和属性。在JavaScript面向对象分层思维中,每个层次都是相互独…

    C# 2023年5月31日
    00
  • C#控制键盘按键的常用方法

    C#控制键盘按键的常用方法 C#是一种通用的、面向对象的编程语言,常用于开发Windows应用程序。在Windows应用程序中,控制键盘按键是非常常见的操作,因此掌握C#控制键盘按键的常用方法是非常必要的。 本文将介绍几种控制键盘按键的常用方法,包括SendKeys类、keybd_event函数和InputSimulator类。 使用SendKeys类 Se…

    C# 2023年6月1日
    00
  • 解决WCF不能直接序列化SqlParameter类型的问题

    为了解决WCF不能直接序列化 SqlParameter 类型的问题,可以采用以下步骤: 1. 自定义 DataContractResolver SqlParameter 类型不能被WCF直接序列化,需要自定义 DataContractResolver 以解决该问题。在自定义 DataContractResolver 的过程中,需要使用一些类来处理实际的序列化…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部