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