将数据分区 (C#)
LINQ 中的分区是指将输入序列划分为两个部分的操作,无需重新排列元素,然后返回其中一个部分。
重要
这些示例使用 System.Collections.Generic.IEnumerable<T> 数据源。 基于 System.Linq.IQueryProvider 的数据源使用 System.Linq.IQueryable<T> 数据源和表达式树。 表达式树对允许的 C# 语法有限制。 此外,每个 IQueryProvider
数据源(如 EF Core)可能会施加更多限制。 查看数据源的文档。
下图显示对字符序列进行三种不同的分区操作的结果。 第一个操作返回序列中的前三个元素。 第二个操作跳过前三个元素,返回剩余元素。 第三个操作跳过序列中的前两个元素,返回接下来的三个元素。
下面一节列出了对序列进行分区的标准查询运算符方法。
运算符
方法名称 | 说明 | C# 查询表达式语法 | 详细信息 |
---|---|---|---|
Skip | 跳过序列中指定位置之前的元素。 | 不适用。 | Enumerable.Skip Queryable.Skip |
SkipWhile | 基于谓词函数跳过元素,直到元素不符合条件。 | 不适用。 | Enumerable.SkipWhile Queryable.SkipWhile |
Take | 获取序列中指定位置之前的元素。 | 不适用。 | Enumerable.Take Queryable.Take |
TakeWhile | 基于谓词函数获取元素,直到元素不符合条件。 | 不适用。 | Enumerable.TakeWhile Queryable.TakeWhile |
Chunk | 将序列的元素拆分为指定最大大小的区块。 | 不适用。 | Enumerable.Chunk Queryable.Chunk |
以下示例都使用 Enumerable.Range(Int32, Int32) 生成从 0 到 7 的数字序列。
使用 Take
方法只获取序列中的第一个元素:
foreach (int number in Enumerable.Range(0, 8).Take(3))
{
Console.WriteLine(number);
}
// This code produces the following output:
// 0
// 1
// 2
使用 Skip
方法跳过序列中的第一个元素,使用其余元素:
foreach (int number in Enumerable.Range(0, 8).Skip(3))
{
Console.WriteLine(number);
}
// This code produces the following output:
// 3
// 4
// 5
// 6
// 7
TakeWhile
和 SkipWhile
方法也可获取和跳过序列中的元素。 但是,这些方法并不获取固定数量的元素,而是根据条件跳过或获取元素。 TakeWhile
会获取序列中的元素,除非元素不符合条件。
foreach (int number in Enumerable.Range(0, 8).TakeWhile(n => n < 5))
{
Console.WriteLine(number);
}
// This code produces the following output:
// 0
// 1
// 2
// 3
// 4
只要条件为 true,SkipWhile
会跳过第一个元素。 返回不符合条件的第一个元素以及所有后续元素。
foreach (int number in Enumerable.Range(0, 8).SkipWhile(n => n < 5))
{
Console.WriteLine(number);
}
// This code produces the following output:
// 5
// 6
// 7
Chunk
运算符用于根据给定的 size
拆分序列的元素。
int chunkNumber = 1;
foreach (int[] chunk in Enumerable.Range(0, 8).Chunk(3))
{
Console.WriteLine($"Chunk {chunkNumber++}:");
foreach (int item in chunk)
{
Console.WriteLine($" {item}");
}
Console.WriteLine();
}
// This code produces the following output:
// Chunk 1:
// 0
// 1
// 2
//
//Chunk 2:
// 3
// 4
// 5
//
//Chunk 3:
// 6
// 7
上述 C# 代码:
- 依赖于 Enumerable.Range(Int32, Int32) 生成数字序列。
- 应用
Chunk
运算符,将序列拆分为最大大小为 3 的块。