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#编程技能的开发者来说至关重要。

相关推荐
小码编匠5 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
Envyᥫᩣ8 小时前
C#语言:从入门到精通
开发语言·c#
IT技术分享社区14 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
△曉風殘月〆21 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風1 天前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_656974741 天前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo1 天前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo1 天前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发1 天前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf