C#进阶高级语法之LINQ :Lambda 表达式

C# 中的 LINQ (Language Integrated Query) 提供了一种声明性的数据查询和操作方法,它允许开发人员对集合、数据库等数据源进行查询和操作,而不需要编写复杂的循环和手动编码。Lambda 表达式与 LINQ 紧密相关,它提供了一种简洁的方式来定义匿名函数。

Lambda 表达式在 LINQ 中经常用于定义查询中的行为,比如在 Where、Select 和 OrderBy 等查询操作中。

1. Lambda表达式基础

Lambda表达式是一种简洁的匿名函数表示形式,可以作为方法引用的替代品。它通常有以下形式:

csharp 复制代码
(input-parameters) => expression

如果只有一个参数,可以省略参数列表和括号:

csharp 复制代码
x => expression

Lambda表达式可以包含多个参数,甚至可以包含语句。例如:

csharp 复制代码
(x, y) => x + y

2. LINQ中使用Lambda表达式

在LINQ查询中,Lambda表达式常用于定义查询中的行为,如Where、Select、OrderBy等操作。下面我们将通过一些示例来介绍Lambda表达式在LINQ中的应用。

2.1. 使用Lambda表达式进行Where查询

假设有一个学生对象的列表,每个学生有Name和Age属性。

csharp 复制代码
List<Student> students = new List<Student>
{
    new Student { Name = "张三", Age = 20 },
    new Student { Name = "李四", Age = 22 },
    // ... 其他学生
};

我们可以使用Lambda表达式进行Where查询,筛选出年龄小于21岁的学生:

csharp 复制代码
var youngStudents = students.Where(s => s.Age < 21);

2.2. 使用Lambda表达式进行Select查询

同样,我们可以使用Lambda表达式进行Select查询,获取每个学生的名字:

csharp 复制代码
var studentNames = students.Select(s => s.Name);

2.3. 使用Lambda表达式进行OrderBy和ThenBy查询

我们还可以使用Lambda表达式进行OrderBy和ThenBy查询,根据年龄和名字对 students 进行排序:

csharp 复制代码
var sortedStudents = students.OrderBy(s => s.Age).ThenBy(s => s.Name);

这里第一个 Lambda 表达式 s => s.Age 定义了根据年龄排序的准则,第二个 Lambda 表达式 s => s.Name 定义了当年龄相同时,按名字排序的准则。

3. Lambda表达式和Action委托

Lambda表达式也可以用来创建Action委托,例如在foreach循环中使用Action委托。

csharp 复制代码
foreach (var student in students)
{
    student.PrintStudentInfo(); // 假设学生类有一个这样的方法
}

// 或者使用Lambda表达式来简化
students.ForEach(student => student.PrintStudentInfo());

4. Lambda表达式和Func委托

Func委托用于返回结果的匿名函数。例如,我们从学生列表中获取一个年龄大于20岁的学生的名字:

csharp 复制代码
var studentName = students.FirstOrDefault(s => s.Age > 20).Name;

5. 如何使用LINQ和Lambda表达式结合进行查询

在C#中,我们可以使用LINQ和Lambda表达式结合进行查询,例如对一个整数列表进行排序和筛选。下面是一个示例:

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQLambdaExample
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            // 使用LINQ和Lambda表达式进行查询
            var sortedNumbers = numbers.OrderBy(n => n).ThenBy(n => n);
            // 输出查询结果
            foreach (var number in sortedNumbers)
            {
                Console.WriteLine(number);
            }
        }
    }
}

在上面的示例中,我们首先创建了一个整数列表numbers,然后使用LINQ查询对其进行排序。在OrderBy方法中,我们使用Lambda表达式n => n作为排序条件,实现从小到大排序。接着,我们使用ThenBy方法再次进行排序,这里同样使用了Lambda表达式n => n作为排序条件,实现从大到小排序。最后,我们遍历查询结果并输出。

6. 示例代码演示LINQ和Lambda表达式在实际应用中的使用

下面是一个使用LINQ和Lambda表达式操作List集合的示例:

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;

namespace LINQLambdaExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个学生列表
            List<Student> students = new List<Student>
            {
                new Student { Name = "张三", Age = 18, Grade = 90 },
                new Student { Name = "李四", Age = 19, Grade = 85 },
                new Student { Name = "王五", Age = 20, Grade = 92 },
                new Student { Name = "赵六", Age = 17, Grade = 88 },
            };

            // 使用LINQ和Lambda表达式查询年龄大于18岁的学生
            var queryResult = students.Where(s => s.Age > 18);

            // 输出查询结果
            foreach (var student in queryResult)
            {
                Console.WriteLine($"姓名:{student.Name}, 年龄:{student.Age}, 成绩:{student.Grade}");
            }
        }
    }

    class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int Grade { get; set; }
    }
}

在这个示例中,我们首先创建了一个Student类,表示学生信息。然后创建了一个students列表,包含四个学生对象。接下来,我们使用LINQ查询students列表,筛选出年龄大于18岁的学生。在Where方法中,我们使用Lambda表达式s => s.Age > 18作为筛选条件。最后,我们遍历查询结果并输出。

在这个示例中,我们可以看到LINQ和Lambda表达式如何简化代码,使得数据查询和处理更加清晰和简洁。

总结

本文介绍了C#中LINQ和Lambda表达式的定义、用途和如何结合使用。通过示例代码,我们看到了LINQ和Lambda表达式在实际应用中的优势,包括简洁的语法和强大的功能。掌握这两个概念对于希望提高C#编程技能的开发者来说至关重要。

相关推荐
新手unity自用笔记14 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
qinzechen15 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
yufei-coder19 小时前
C# Windows 窗体开发基础
vscode·microsoft·c#·visual studio
dangoxiba19 小时前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十三集:制作小骑士的接触地刺复活机制以及完善地图的可交互对象
游戏·unity·visualstudio·c#·游戏引擎
AitTech19 小时前
深入理解C#中的TimeSpan结构体:创建、访问、计算与格式化
开发语言·数据库·c#
hiyo5851 天前
C#中虚函数和抽象函数的概念
开发语言·c#
开心工作室_kaic1 天前
基于微信小程序的校园失物招领系统的设计与实现(论文+源码)_kaic
c语言·javascript·数据库·vue.js·c#·旅游·actionscript
时光追逐者1 天前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
前端·microsoft·开源·c#·.net·layui·.netcore
friklogff1 天前
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
开发语言·c#·.net
hiyo5852 天前
C#的面向对象
开发语言·c#