分区数据 (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# 代码:

另请参阅