Поделиться через


Секционирование данных (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
Take Возвращает элементы на указанную позицию в последовательности. Неприменимо. 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

SkipWhile Методы TakeWhile также принимают и пропускают элементы последовательности. Однако вместо заданного числа элементов эти методы пропускают или принимают элементы на основе условия. 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#:

  • Использует Enumerable.Range(Int32, Int32) для создания последовательности чисел.
  • Применяет оператор Chunk, разделяя последовательность на блоки, которые содержат максимум три элемента.

См. также