- 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/
Нажмите здесь для печати.