Chcę użyć inicjatora kolekcji dla następnego bitu kodu:
public Dictionary<int, string> GetNames()
{
Dictionary<int, string> names = new Dictionary<int, string>();
names.Add(1, "Adam");
names.Add(2, "Bart");
names.Add(3, "Charlie");
return names;
}
Więc zazwyczaj powinno to być coś takiego:
return new Dictionary<int, string>
{
1, "Adam",
2, "Bart"
...
Ale jaka jest poprawna składnia tego?
Odpowiedzi:
źródło
Dictionary<TKey, TValue>
podklas, czy też będzie działaćICollection<KeyValuePair<TKey, TValue>>
?var
zamiast typu deklarującego, lub jeśli opuszczenie typu deklarującego można pominąćnew Dictio...
- stackoverflow.com/questions/5678216/ ...var
dosłownie oszczędza ci naciśnięć klawiszy, jest domyślnie silnie wpisany .var
a powtarzaniem sięSomeType obj = new SomeType...
. A ponieważ nie możesz zadeklarowaćvar obj;
bez natychmiastowej inicjalizacji, po prostu nie widzę problemu. Naprawdę próbuję się nauczyć, ale nie mogę określić twojej pozycji.Składnia jest nieco inna:
Zwróć uwagę, że skutecznie dodajesz krotki wartości.
Na marginesie: inicjatory kolekcji zawierają argumenty, które są w zasadzie argumentami dowolnej funkcji Add (), która jest przydatna w odniesieniu do typu argumentu w czasie kompilacji. To znaczy, jeśli mam kolekcję:
poniższy kod jest całkowicie legalny:
źródło
IEnumerable
i maAdd()
metody.Add
.IEnumerable<T>
i maAdd
metodę. JeśliAdd
metoda przyjmuje 3 parametry, będziesz potrzebować 3 obiektów w nawiasach.źródło
Pytanie jest otagowane
c#-3.0
, ale dla pełnego wyjaśnienia wspomnę o nowej składni dostępnej w C # 6 na wypadek, gdybyś korzystał z Visual Studio 2015 (lub Mono 4.0):Uwaga: stara składnia wspomniana w innych odpowiedziach nadal działa, jeśli wolisz to. Ponownie, dla kompletności, oto stara składnia:
Inną fajną rzeczą, na którą należy zwrócić uwagę, jest to, że w każdej składni możesz zostawić ostatni przecinek, jeśli chcesz, co ułatwia kopiowanie / wklejanie dodatkowych linii. Na przykład, kompiluje się dobrze:
źródło
Jeśli szukasz nieco mniej szczegółowej składni, możesz utworzyć podklasę
Dictionary<string, object>
(lub jakikolwiek inny typ) w następujący sposób:Następnie po prostu zainicjuj w ten sposób
Co jest równoważne
Korzyścią jest to, że dostajesz wszystkie rzeczy typu kompilacji, których możesz chcieć, takie jak możliwość powiedzenia
is DebugKeyValueDict
zamiastis IDictionary<string, object>
lub zmianę typów klucza lub wartości w późniejszym terminie. Jeśli robisz coś takiego na stronie cshtml maszynki do golenia, jest to o wiele przyjemniejsze.
Oprócz bycia mniej szczegółowym możesz oczywiście dodać dodatkowe metody do tej klasy, co tylko zechcesz.
źródło
W poniższym przykładzie kodu a
Dictionary<TKey, TValue>
jest inicjowany z wystąpieniami typuStudentName
.z msdn
źródło
Tak, możemy użyć inicjatora kolekcji w słowniku.Jeśli mamy taki słownik
Możemy go zainicjować w następujący sposób.
źródło