Секционирование данных (C#)
Секционированием в LINQ называют операцию разделения входной последовательности на два раздела без изменения порядка элементов, а затем возвращения одного из разделов.
Внимание
В этих примерах используется System.Collections.Generic.IEnumerable<T> источник данных. Источники данных, основанные на System.Linq.IQueryProvider использовании System.Linq.IQueryable<T> источников данных и деревьев выражений. Деревья выражений имеют ограничения на допустимый синтаксис C#. Кроме того, каждый IQueryProvider
источник данных, например EF Core , может наложить больше ограничений. Ознакомьтесь с документацией по источнику данных.
На следующем рисунке показаны результаты трех различных операций секционирования в последовательности символов. Первая операция возвращает первые три элемента в последовательности. Вторая операция пропускает первые три элемента и возвращает остальные элементы. Третья операция пропускает первые два элемента в последовательности и возвращает три следующих элемента.
Далее перечислены методы стандартных операторов запроса, которые секционируют последовательности.
Операторы
Имена методов | 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
, разделяя последовательность на блоки, которые содержат максимум три элемента.