第九章 生产线上的黑科技
第九章 生产线上的黑科技
LINQ
什么是LINQ?
LINQ(语言集成查询)是将查询功能直接集成到C#中。提供了一种统一的方式来查询不同来源的数据——无论是数组、集合、数据库、XML 还是其他格式。通过在 C# 中使用 LINQ,不再需要学习多种查询语言来处理不同的数据格式。
LINQ中的许多方法(如 Where, Select)本质上是扩展方法。
// 设定数据源
var numbers = new List<int> { 1, 2, 3, 4, 5 };
// 调用扩展方法
string result = numbers.ToFormattedString();
// 输出:1, 2, 3, 4, 5
Console.WriteLine(result);
public static class CollectionExtensions
{
public static string ToFormattedString<T>(this IEnumerable<T> collection)
{
return string.Join(", ", collection);
}
}
LINQ的基本组成
在C#中,LINQ主要由以下几个组成部分:
- 数据源(Data source):可以是集合、数组、数据库、XML文档等等。
- 查询变量(Query variable):用于存储查询结果的变量。
- 查询表达式(Query expression):类似于SQL语句的查询表达式,用于描述查询的逻辑和条件。
- 查询操作符(Query operator):用于执行各种查询操作,如筛选、排序、分组、投影等等。
- 查询结果(Query result):查询操作的返回结果。
LINQ用法
- 查询语法
LINQ提供了一种类似SQL语法的查询方式,可以通过from、where、select等关键字来编写查询表达式。例如,我们有一个包含学生信息的集合,可以使用以下方式查询名字以"A"开头的学生:
List<string> students = new List<string> { "Alice", "Bob", "Charlie", "Amy" };
var query = from student in students
where student.StartsWith("A")
select student;
foreach (var student in query)
{
Console.WriteLine(student);
}
- 方法语法
除了查询语法,LINQ还提供了方法语法,可以通过一系列的方法调用来实现查询操作。方法语法通常使用Lambda表达式来定义查询条件。以下是使用方法语法查询名字以"A"开头的学生的示例:
List<string> students = new List<string> { "Alice", "Bob", "Charlie", "Amy" };
var query = students.Where(s => s.StartsWith("A"));
foreach (var student in query)
{
Console.WriteLine(student);
}
例子
- Select:将序列中的每个元素投影到新的形式。
Select:这个函数用于将序列中的每个元素投影到新的形式。例如,你可以使用Select函数将一个整数列表中的每个元素乘以2。
List<int> numbers = new List<int> { 1, 2, 3, 4 };
var result = numbers.Select(n => n * 2);
// 输出结果: 2 4 6 8
foreach (var item in result)
{
Console.WriteLine(item);
}
- Where:过滤序列中的元素。
Where:这个函数用于过滤序列中的元素。例如,你可以使用Where函数找出一个整数列表中的所有偶数。
List<int> numbers = new List<int> { 1, 2, 3, 4 };
var result = numbers.Where(n => n % 2 == 0);
// 输出结果: 2 4
foreach (var item in result)
{
Console.WriteLine(item);
}
- Aggregate:将序列中的所有元素累积到一个单一的结果。
Aggregate:这个函数用于将序列中的所有元素累积到一个单一的结果。例如,你可以使用Aggregate函数计算一个整数列表中的所有元素的总和。
List<int> numbers = new List<int> { 1, 2, 3, 4 };
int result = numbers.Aggregate((acc, n) => acc + n);
// 输出结果: 10
Console.WriteLine(result);
- Concat:连接两个序列。
Concat:这个函数用于连接两个序列。
List<int> numbers1 = new List<int> { 1, 2, 3 };
List<int> numbers2 = new List<int> { 4, 5, 6 };
var result = numbers1.Concat(numbers2);
// 输出结果: 1 2 3 4 5 6
foreach (var item in result)
{
Console.WriteLine(item);
}
- OrderBy和OrderByDescending:对序列中的元素进行排序。
OrderBy和OrderByDescending:这两个函数用于对序列中的元素进行排序。
List<int> numbers = new List<int> { 3, 1, 4, 2 };
var ascendingResult = numbers.OrderBy(n => n);
// 输出结果: 1 2 3 4
foreach (var item in ascendingResult)
{
Console.WriteLine(item);
}
var descendingResult = numbers.OrderByDescending(n => n);
// 输出结果: 4 3 2 1
foreach (var item in descendingResult)
{
Console.WriteLine(item);
}
- GroupBy:根据指定的键对序列中的元素进行分组。
GroupBy:这个函数用于根据指定的键对序列中的元素进行分组。
List<string> fruits = new List<string> { "apple", "banana", "cherry", "avocado" };
var result = fruits.GroupBy(f => f[0]);
// 输出结果:
// a: apple avocado
// b: banana
// c: cherry
foreach (var group in result)
{
Console.WriteLine($"{group.Key}: {string.Join(" ", group)}");
}