среда, 18 июня 2008 г.

Map/reduce/filter на С# 3.0

Dare Obasanjo пишет о своём опыте работы с фичами нового C# - Enumerable.Select, Enumerable.Aggregate, Enumerable.Where, понять суть которых без опыта использования функций высшего порядка(high-order functions) сложно.

Каждый объект, реализующий IEnumerable, в C# 3.0 позволяет принимать новые типы вызовов, оперирующих лямбда-функциями.
Некоторые их применения очевидны - IEnumerable.Max(person=> person.Salary) вернет максимальный оклад для списка работников.

Некоторые менее очевидны, особенно если их названия наводят на ложные аналогии с LINQ:
IEnumerable.Select - применяет функцию к списку элементов, возвращает список результатов работы функции. Python для этого имеет более понятное название - map.
IEnumerable.Aggregate - применяет функцию от двух аргументов ко всем элементам списка по очереди, возвращает результат последнего вычисления функции. В Python - reduce.
IEnumerable.Where - возвращает элементы списка, удовлетворяющие условию, задаваемому лямбда-функцией. В Python - filter.

Определенно, сделав синтаксис LINQ "читаемым" и sql-подобным, разработчики C# потеряли выразительность языка в других применениях.

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