Linq Методы Skip и Take

C Sharp > Linq Методы Skip и Take
02.12.2016 12:10:42


Наиболее часто встречающиеся слова в статье:

[элементов] [элемента] [numbers] [условию] [foreach] [Console] [WriteLine] [начиная] [SkipWhile] [Мадрид"]


Статья:

Метод Skip() пропускает определенное количество элементов, а метод Take() извлекает определенное число элементов. Нередко данные методы применяются вместе для создания постраничного вывода.

Извлечем три первых элемента:

int[] numbers = { -3, -2, -1, 0, 1, 2, 3 };
var result = numbers.Take(3);

foreach (int i in result)
Console.WriteLine(i);
Выберем все элементы, кроме первых трех:

var result = numbers.Skip(3);
Совмещая оба метода, мы можем выбрать определенное количество элементов начиная с определенного элемента. Например, выберем три элемента, начиная с пятого (то есть пропустив четыре элемента):

int[] numbers = { -3, -2, -1, 0, 1, 2, 3 };
var result = numbers.Skip(4).Take(3);

foreach (int i in result)
Console.WriteLine(i);
Похожим образом работают методы TakeWhile и SkipWhile.

Метод TakeWhile выбирает цепочку элементов, начиная с первого элемента, пока они удовлетворяют определенному условию. Например:

string[] teams = { "Бавария", "Боруссия", "Реал Мадрид", "Манчестер Сити", "ПСЖ", "Барселона" };
foreach (var t in teams.TakeWhile(x=>x.StartsWith("Б")))
Console.WriteLine(t);
Согласно условию мы выбираем те команды, которые начинаются с буквы Б. В массиве есть три таких команды. Однако в цикле будут выведены только две первых:

Бавария
Боруссия
Потому что цепочка обрывается на третьей команде - "Реал Мадрид" - она не соответствует условию, и после этого выборка уже не идет.

Если бы первой командой в массиве стояла бы команда, начинающаяся не с буквы Б, например, "Реал Мадрид", то в этом случае метод возвратил бы нам 0 элементов.

В подобном русле действует метод SkipWhile. Он пропускает цепочку элементов, начиная с первого элемента, пока они удовлетворяют определенному условию. Например:


string[] teams = { "Бавария", "Боруссия", "Реал Мадрид", "Манчестер Сити", "ПСЖ", "Барселона" };
foreach (var t in teams.SkipWhile(x=>x.StartsWith("Б")))
Console.WriteLine(t);
Первые две команды, которые начинаются с буквы Б и соответствуют условию, будут пропущены. На третьей команде цепочка обрывается, поэтому последняя команда, начинающаяся с буквы Б, будет включена в выходной список:

Реал Мадрид
Манчестер Сити
ПСЖ
Барселона
И опть же если в массиве первый элемент не начинался бы с буквы Б, то цепочка пропускаемых элементов прервалась бы уже на первом элементе, и поэтому метод SkipWhile возвратил бы все элементы массива.