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


Секционирование данных (C#)

Секционирование в LINQ относится к операции разделения входной последовательности на два раздела без переупорядочения элементов, а затем возврата одного из разделов.

Это важно

В этих примерах используется System.Collections.Generic.IEnumerable<T> источник данных. Источники данных, основанные на System.Linq.IQueryProvider, используют System.Linq.IQueryable<T> источники данных и деревья выражений. Деревья выражений имеют ограничения на допустимый синтаксис C#. Кроме того, каждый IQueryProvider источник данных, например EF Core , может наложить больше ограничений. Ознакомьтесь с документацией по источнику данных.

На следующем рисунке показаны результаты трех разных операций секционирования в последовательности символов. Первая операция возвращает первые три элемента в последовательности. Вторая операция пропускает первые три элемента и возвращает оставшиеся элементы. Третья операция пропускает первые два элемента в последовательности и возвращает следующие три элемента.

Иллюстрация, показывающая три операции секционирования LINQ.

Стандартные методы оператора запроса, которые разделяют последовательности, перечислены в следующем разделе.

Операторы

Имена методов Описание Синтаксис выражения запроса C# Дополнительные сведения
Пропустить Пропускает элементы до указанной позиции в последовательности. Неприменимо. Enumerable.Skip
Queryable.Skip
ПропуститьПока Пропускает элементы на основе функции предиката, пока элемент не удовлетворяет условию. Неприменимо. Enumerable.SkipWhile
Queryable.SkipWhile
Взять Выбирает элементы до указанной позиции в последовательности. Неприменимо. Enumerable.Take
Queryable.Take
TakeTime Принимает элементы на основе функции предиката, пока элемент не удовлетворяет условию. Неприменимо. 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

Методы 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

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 оператор, разделяя последовательность на блоки с максимальным размером 3.

См. также