Ряд методов в LINQ позволяют получить часть коллекции, в частности, такие методы как Skip, Take, SkipWhile, TakeWhile.
Метод Skip() пропускает определенное количество элементов. Количество пропускаемых элементов передается в качестве параметра в метод:
string[] people = { "Tom", "Sam", "Bob", "Mike", "Kate" }; // пропускаем первые два элемента var result = people.Skip(2); // "Bob", "Mike", "Kate" foreach (var person in result) Console.WriteLine(person);
В данном случае пропускаем первые два элемента. Консольный вывод:
Bob Mike Kate
Если необходимо пропустить определенное количество элементов с конца коллекции, то применяется метод SkipLast():
string[] people = { "Tom", "Sam", "Bob", "Mike", "Kate" }; // пропускаем последние два элемента var result = people.SkipLast(2); // "Tom", "Sam", "Bob" foreach (var person in result) Console.WriteLine(person);
В данном случае пропускаем последние два элемента. Консольный вывод:
Tom Sam Bob
Метод SkipWhile() пропускает цепочку элементов, начиная с первого элемента, пока они удовлетворяют определенному условию:
SkipWhile(Func<TSource, bool> predicate);
В метод передается делегат, который представляет условие, он получает каждый элемент коллекции и возвращает значение true, если элемент соответствует условию. Например:
string[] people = { "Tom", "Sam", "Mike", "Kate", "Bob" }; // пропускаем первые элементы, длина которых равна 3 var result = people.SkipWhile(p=> p.Length == 3); // "Mike", "Kate", "Bob" foreach (var person in result) Console.WriteLine(person);
Здесь метод SkipWhile пропускает элементы, длина которых равна 3 символам. Первые два элемента массива people ("Tom", "Sam") соответствуют этому условию и поэтому будут пропущены. На третьем элементе ("Mike") цепочка обрывается, поэтому последний элемент ("Bob"), длина которго тоже равна 3-м символам, не будет пропущен и будет включен в выходную коллекцию:
Mike Kate Bob
Если в массиве первый элемент имел бы длину больше или меньше 3 символов, то цепочка пропускаемых элементов прервалась бы уже на первом элементе, и поэтому метод SkipWhile возвратил бы все элементы массива.
Метод Take() извлекает определенное число элементов. Количество извлекаемых элементов передается в метод в качестве параметра. Например, извлечем три первых элемента:
string[] people = { "Tom", "Sam", "Mike", "Kate", "Bob" }; // извлекаем первые 3 элемента var result = people.Take(3); // "Tom", "Sam", "Mike" foreach (var person in result) Console.WriteLine(person);
Метод TakeLast() извлекает определенное количество элементов с конце коллекции:
string[] people = { "Tom", "Sam", "Mike", "Kate", "Bob" }; // извлекаем последние 3 элемента var result = people.TakeLast(3); // "Mike", "Kate", "Bob" foreach (var person in result) Console.WriteLine(person);
Метод TakeWhile() выбирает цепочку элементов, начиная с первого элемента, пока они удовлетворяют определенному условию:
TakeWhile(Func<TSource, bool> predicate);
В метод передается делегат, который представляет условие, он получает каждый элемент коллекции и возвращает значение true, если элемент соответствует условию. Например:
string[] people = { "Tom", "Sam", "Mike", "Kate", "Bob" }; // извлекаем первые элементы, длина которых равна 3 var result = people.TakeWhile(p=> p.Length == 3); // "Tom", "Sam" foreach (var person in result) Console.WriteLine(person);
Здесь метод TakeWhile выбирает элементы, длина которых равна 3 символам. Первые два элемента массива people ("Tom", "Sam") соответствуют этому условию и поэтому будут выбраны в выходную коллекцию. На третьем элементе ("Mike") цепочка обрывается, поэтому последний элемент ("Bob"), длина которго тоже равна 3-м символам, не будет включен в выходную коллекцию:
Tom Sam
Если бы первый элемент в массиве имел бы длину больше или меньше 3 символов, то в этом случае метод TakeWhile возвратил бы нам 0 элементов.
Совмещая оба метода - Take и Skip, мы можем выбрать определенное количество элементов начиная с определенного элемента. Например, выберем два элемента, начиная со четвертого (то есть пропустим 3 первых элемента):
string[] people = { "Tom", "Sam", "Mike", "Kate", "Bob", "Alice" }; // пропускаем 3 элемента и выбираем 2 элемента var result = people.Skip(3).Take(2); // "Kate", "Bob" foreach (var person in result) Console.WriteLine(person);