分区数据 (C#)

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

重要

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

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

展示三个 LINQ 分区操作的插图。

以下部分列出了用于分割序列的标准查询操作符方法。

运营商

方法名称 DESCRIPTION C# 查询表达式语法 详细信息
跳过 跳过序列中元素直到指定位置。 不適用。 Enumerable.Skip
Queryable.Skip
SkipWhile 跳过基于谓词函数的元素,直到元素不满足条件。 不適用。 Enumerable.SkipWhile
Queryable.SkipWhile
将元素置于序列中的指定位置。 不適用。 Enumerable.Take
Queryable.Take
TakeWhile 根据谓词函数获取元素,直到元素不满足条件。 不適用。 Enumerable.TakeWhile
Queryable.TakeWhile
区块 将序列的元素拆分为指定最大大小的区块。 不適用。 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

SkipWhile 只要条件为 true,就跳过第一个元素。 返回与条件不匹配的第一个元素以及所有后续元素。

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# 代码:

另请参阅