Как вы работаете с IList <> в F #? - PullRequest
4 голосов
/ 03 апреля 2010

У меня есть список типа IList<Effort>. Модель Effort содержит float с именем Amount. Я хотел бы вернуть сумму Amount для всего списка, в F #. Как это будет достигнуто?

Ответы [ 4 ]

6 голосов
/ 03 апреля 2010
efforts |> Seq.sumBy (fun e -> e.Amount)
5 голосов
/ 03 апреля 2010

Upvoted ответы Seq.fold, с конвейером Seq.fold и с конвейером Seq.sumBy (мне больше нравится третий).

Тем не менее, никто не упомянул, что seq<'T> - это имя F # для IEnumerable<T>, и поэтому функции модуля Seq работают на любом IEnumerable, включая IList s.

4 голосов
/ 03 апреля 2010

Одна деталь, которая может быть интересной, - это то, что вы также можете избежать использования аннотаций типов. В коде sepp2k вам необходимо указать, что значение effort имеет тип Effort, потому что компилятор обрабатывает код слева направо (и он не будет работать при вызове effort.Amount если не знал тип). Вы можете написать это с помощью оператора конвейерной обработки:

efforts |> Seq.fold (fun acc effort -> acc + effort.Amount) 0.0  

Теперь компилятору известен тип effort, поскольку он знает, что обрабатывает коллекцию efforts типа IList<Effort>. Это небольшое улучшение, но я думаю, что это довольно приятно.

4 голосов
/ 03 апреля 2010
Seq.fold (fun acc (effort: Effort) -> acc + effort.Amount) 0.0 efforts
...