- PVSM.RU - https://www.pvsm.ru -
Я думаю многим читателям блога .Net знакомо имя John Skeet. Особенно после вчерашнего поста [1] юзера SergeyT [2]. Поэтому я не буду повторять про сравнение с Чаком Норрисом [3] и первое место по карме на StackOverflow.com. А вот упомянуть лишний раз про его замечательную книгу “C# In Depth” [4] точно лишним не будет. Центральное место в ней занимает LINQ вообще и LINQ to Objects в частности. Джон очень обстоятельно описывает все возможности языка C# и платформы .Net, которые сделали возможным появление LINQ в его нынешнем виде, а также подробности его реализации. Именно после прочтения этой книги я стал активно использовать LINQ to Objects в своих проектах. Однако в стандартной библиотеке не хватает нескольких крайне нужных операторов. К счастью, Джон Скит исправил это недоразумение. Так появилась небольшая, но очень полезная библиотка morelinq [5]. А с конца прошлого года она доступна в виде NuGet-пакета [6].
| Batch | Превращает одну последовательность в несколько последовательностей по n элементов. |
| Concat | Присоединяет элемент к коллекции либо коллекцию к элементу. |
| Consume | «Поглощает» коллекцию, не производя никаких действий над элементами. |
| DistinctBy | Возвращает только уникальные элементы (по заданному критерию). |
| EquiZip | Создает новую последовательность, где каждый элемент создается на основе соответствующих элементов исходных последовательностей. Если последовательности имеют различное количество элементов, будет брошено исключение InvalidOperationException. |
| ExceptBy | Возвращает элементы первой последовательности, которые не содержатся во второй (по заданному критерию). |
| ForEach | Выполняет действие над каждым элементом последовательности. |
| Generate | Генерирует последовательности по начальному элементу и функции-генератору. |
| GenerateByIndex | Генерирует последовательность по индексам элементов. |
| GroupAdjacent | Подобен GroupBy, но в группу попадают только идущие подряд элементы. |
| Index | Возвращает последовательность пар индекс-значение. |
| MaxBy | Возвращает максимальный элемент последовательности по заданному критерию. |
| MinBy | Возвращает минимальный элемент последовательности по заданному критерию. |
| Pad | Если количество элементов последовательности меньше заданного, дополняет последовательность значениями по умолчанию до заданного количества. |
| Pairwise | Возвращает последовательность результатов функции текущего и предыдущего элемента (не применяется к первому элементу). |
| Pipe | Возвращает исходную последовательность, выполняя Action над каждым элементом. |
| Prepend | Дополняет начало коллекции заданным элементом. |
| PreScan | Возвращает последовательность исходной длины, в которой N-й элемент определяется применением заданного преобразования к N-1 элементов. |
| Scan | Возвращает последовательность исходной длины, в которой N-й элемент определяется применением заданного преобразования к N элементов. |
| SingleOrFallback | Возвращает единственный элемент последовательности либо результат заданного делегата, если последовательность пуста. |
| SkipUntil | Пропускает элементы исходной последовательности, пока заданное условие не станет истинным. Текущий элемент будет последним пропущенным. |
| Split | Разделяет последовательность заданным разделителем (возвращает последовательность последовательностей). |
| TakeEvery | Возвращает каждый N-й элемент исходной последовательности. |
| TakeLast | Возвращает последние N элементов исходной последовательности. |
| TakeUntil | Возвращает элементы исходной последовательности, пока заданное условие не станет истинным. Текущий элемент будет последним возвращенным. |
| ToDataTable | Позволяет преобразовать последовательность в новую DataTable или заполнить имеющуюся. Есть возможность задать лямдами получение из исходного элемента значений для полей таблицы. |
| ToDelimitedString | Преобразует последовательность в строку с разделителями (то что обычно приходится делать через нудный Aggregate). |
| ToHashSet | Возвращает HashSet〈T&кang; от исходных элементов. |
| Zip | То же, что EquiZip, но длина результирующей последовательности будет равна длине наименьшей из исходных. |
| ZipLongest | То же, что EquiZip, но длина результирующей последовательности будет равна длине наибольшей из исходных (в качестве недостающих значений будет использовано значение по умолчанию). |
Большинство операторов перегружены для большей гибкости использования (например, можно задать свой IComparer и т.п.). Кроме перечисленных операторов, имеются еще два отладочных – AssertCount (проверяют количество элементов последовательности) и Trace (выводит все элементы в debug-консоль).
Вместе с исходниками библиотеки идет прекрасная документация в стиле MSDN, в которой подробно описаны все операторы, их параметры и имеются примеры использования. Также есть комментарии в исходном коде.
В заключение хочу обратить внимание читателей на две другие библиотеки авторства Джона Скита – MiscUtils [7] и NodaTime [8] (NuGet Package [9]). Особенно интересна последняя – библиотека предназначена для работы с датой/временем. Джон занимался ей последние несколько лет и в ноябре прошлого года наконец выпустил версию 1.0. В его блоге [10] можно почитать много интересного на тему того, чем плохи для этих целей стандартные классы .Net и какие подводные грабли поджидают разработчика, серьезно работающего со временем.
Автор: m_a_d
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/velosiped/26101
Ссылки в тексте:
[1] поста: http://habrahabr.ru/post/137317/
[2] SergeyT: http://habrahabr.ru/users/sergeyt/
[3] сравнение с Чаком Норрисом: http://meta.stackoverflow.com/questions/9134/jon-skeet-facts
[4] “C# In Depth”: http://csharpindepth.com/
[5] morelinq: http://code.google.com/p/morelinq/
[6] NuGet-пакета: http://nuget.org/packages/morelinq
[7] MiscUtils: http://www.yoda.arachsys.com/csharp/miscutil/
[8] NodaTime: https://code.google.com/p/noda-time/
[9] NuGet Package: http://nuget.org/packages/NodaTime/
[10] блоге: http://msmvps.com/blogs/jon_skeet/default.aspx
[11] Источник: http://habrahabr.ru/post/167831/
Нажмите здесь для печати.