LINQ to SQL, по-видимому, не подходит, если вы не используете SQL Server (или SQL Server compact), поэтому для меня было достаточной причиной избежать его и использовать EF (я хотел использовать PostgreSQL).
В v1 EF определенно не хватает вещей, которые заставили бы меня смущаться рекомендовать это. Похоже, что версия 2 EF (когда выйдет) будет первой версией, которую можно было бы серьезно рекомендовать для перехода на.
Мне очень нравится ваша версия reduce
. Я считаю это идиоматическим. Вот версия, в любом случае использующая понимание списка.
(defn foo [m f]
(into {} (for [[k v] m] [k (f v)])))
Вот довольно типичный способ преобразования карты.
zipmap
берет список ключей и список значений и «делает правильные вещи», создавая новую карту Clojure. Вы также можете поместить карту карту
вокруг клавиш, чтобы изменить их, или и то, и другое.
(zipmap (keys data) (map #(do-stuff %) (vals data)))
или заключить его в свою функцию:
(defn map-function-on-map-vals [m f]
(zipmap (keys m) (map f (vals m))))
Here's a fairly idiomatic way to do this:
(defn map-function-on-map-vals [m f]
(apply merge
(map (fn [[k v]] {k (f v)})
m)))
Example:
user> (map-function-on-map-vals {1 1, 2 2, 3 3} inc))
{3 4, 2 3, 1 2}
Я Clojure n00b, так что их может быть много более элегантные решения. Вот мой:
(def example {:a 1 :b 2 :c 3 :d 4})
(def func #(* % %))
(prn example)
(defn remap [m f]
(apply hash-map (mapcat #(list % (f (% m))) (keys m))))
(prn (remap example func))
Функция anon составляет небольшой 2-список из каждого ключа и его значения f'ed. Mapcat запускает эту функцию над последовательностью ключей карты и объединяет все работы в один большой список. "apply hash-map" создает новую карту из этой последовательности. (% M) может выглядеть немного странно, это идиоматический Clojure для применения ключа к карте для поиска связанного значения.
Наиболее рекомендуемая литература: Шпаргалка по Clojure .