将数据分区 (C#)

LINQ 中的分区是指将输入序列划分为两个部分的操作,无需重新排列元素,然后返回其中一个部分。

重要

这些示例使用 System.Collections.Generic.IEnumerable<T> 数据源。 基于 System.Linq.IQueryProvider 的数据源使用 System.Linq.IQueryable<T> 数据源和表达式树。 表达式树对允许的 C# 语法有限制。 此外,每个 IQueryProvider 数据源(如 EF Core)可能会施加更多限制。 查看数据源的文档。

下图显示对字符序列进行三种不同的分区操作的结果。 第一个操作返回序列中的前三个元素。 第二个操作跳过前三个元素,返回剩余元素。 第三个操作跳过序列中的前两个元素,返回接下来的三个元素。

显示三个 LINQ 分区操作的图示。

下面一节列出了对序列进行分区的标准查询运算符方法。

运算符

方法名称 说明 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

TakeWhileSkipWhile 方法也可获取和跳过序列中的元素。 但是,这些方法并不获取固定数量的元素,而是根据条件跳过或获取元素。 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# 代码:

另请参阅