2011-12-22

Расширение возможностей LINQ to Objects

В проектах, которые активно используют LINQ вообще и LINQ to Objects в частности (т.е. практически во всех проектах на .NET 3.5+), часто можно увидеть подобный код:

Такие самописные методы-расширения появляются потому, что в стандартной поставке LINQ to Objects (System.Linq) недостаточно методов для решения всех типовых задач, и ForEach() — только один из примеров. Другой пример — методы получения элемента, в котором заданный член минимален/максимален (стандартные методы Min()/Max() возвращают сам минимальный/максимальный элемент).

Как результат, многие проекты содержат один и тот же набор велосипедов-расширений для LINQ. Естественно предположить, что раз многим нужен ForEach() для IEnumerable, то где-то должна быть библиотека, в котором этот и другие методы уже реализованы. Я нашёл несколько таких библиотек:

  • MoreLINQ — содержит только методы-расширения для IEnumerable общего назначения. Есть в NuGet.
  • LinqLib — содержит также методы для арифметических операций (например, сложить элементы двух последовательностей и получить третью) и методы для работы с числами Фибоначчи/простыми числами. Есть в NuGet.
  • Cadenza — в ней намешано много всего, в том числе и расширения для IEnumerable.

Все эти библиотеки имеют схожую функциональность для работы с IEnumerable (например, во всех из них есть метод-расширение ForEach), так что выделить какую-то одну из них тяжело. Лично мне интерфейс библиотеки MoreLINQ показался достаточно грамотно спроектированным (ничего лишнего), плюс она есть в NuGet; в общем случае выбор придётся делать, отталкиваясь от нужд конкретного проекта.

Комментариев нет:

Отправить комментарий