2013-06-02 27 views
5

W dawnych czasach, możemy wygodnie zainicjować kolekcji zmienny za pomocą szelek, jak w poniższym przykładzie:Czy mogę zainicjować niezmienny zbiór BCL za pomocą nawiasów klamrowych?

var myDictionary = new Dictionary<string, decimal> {{"hello", 0m}, {"world", 1m}}; 

Czy istnieje podobna składnia, które mogą być używane z BCL niezmiennych kolekcji? Rozumiem, że nadal jest to wersja przedpremierowa, ale być może istnieje zalecana składnia, a przynajmniej to pytanie posłuży jako informacja zwrotna do wdrożenia tych wygodnych inicjalizatorów.

W tym czasie, najkrótsza Znalazłem to:

var myDictionary = new Dictionary<string, decimal> {{"hello", 0m}, {"world", 1m}}.ToImmutableDictionary(); 

Odpowiedz

7

Czy istnieje podobna składnia, które mogą być używane z BCL niezmiennych kolekcji?

Nie tak daleko, jak jestem świadom - niestety oba obiektów i kolekcji inicjalizatory polegać na zmienności. W związku z tym szkoda, że ​​język nie jest zaprojektowany tak, że jeśli istnieje metoda Add z wartością zwracaną, która może być używana jako wartość pośrednia. (To nie pomoże z właściwości w inicjatorów obiektu ustawienie, pamiętajcie, i wolę nazwą Plus do Add aby semantyka jaśniejsze.)

Myślę, że podejście używasz już jest najwłaściwszy dla skrót.

Dla ImmutableList to nieco prostsze:

var list = ImmutableList.Create(1, 2, 3); 

który jest dość proste (i pozwala na wnioskowanie typu), ale nie wiem o niczym podobnym do ImmutableDictionary. Istnieje przeciążenie Create, które ma wartość IEnumerable<TKey, TValue>, ale skonstruowanie dowolnej implementacji może być tak samo kłopotliwe jak zwykłe konstruowanie zmiennego słownika, tak jak już to robisz.