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