July 16, 2009
Немного об инициализации коллекций
Читаю сейчас Foundations of F# (тут можно почитать). И вот в главе про императивное программирование наткнулся на интересный способ инициализации коллекций.
Часто бывает так, что надо создать список/словарь/whatever и тут же наполнить его какими-нибудь элементами.
let myList = new System.Collections.Generic.List<int>()
myList.Add(1)
myList.Add(2)
myList.Add(3)
Да, я знаю что можно написать короче, например:
let myList = new System.Collections.Generic.List<int>()
[1;2] |> Seq.iter myList.Add
Но не об этом сейчас разговор. Проблема в том, что такой код мозолит глаза инициализацией за несколько операций. Не могу сказать, такая ли уж это проблема, но чувствую, что что-то не так. ;-)
И вот какое решение предлагается:
let myList =
let temp = new System.Collections.Generic.List<int>()
temp.Add(1)
temp.Add(2)
temp.Add(3)
temp
То есть, вроде бы и функция, но вычисляется один раз, то есть по сути значение. Очень, кстати, похоже на инициализаторы коллекций в свежем C#.
var myList = new System.Collections.Generic.List<int>() { 1, 2, 3 };
Красота?