Powodem, że kod ma nie praca jest opisana w How to: Initialize a Dictionary with a Collection Initializer (C# Programming Guide):
A Dictionary contains a collection of key/value pairs. Its Add method takes two parameters, one for the key and one for the value. To initialize a Dictionary, or any collection whose Add method takes multiple parameters, enclose each set of parameters in braces...
Zatem w składni
{
{ "enabled", "enable", "enabling" },
}
Kompilator spodziewa swoją kolekcję mieć metoda Add(string, string, string)
. Ponieważ nie ma takiej metody na List<string []>
, kompilacja nie powiedzie się.
Tak naprawdę można utworzyć taką kolekcję i zainicjować ją za pomocą tej składni.Jeśli utworzyć następujący zbiór:
public class TripleCollection<T> : IEnumerable<Tuple<T, T, T>>
{
readonly List<Tuple<T, T, T>> list = new List<Tuple<T, T, T>>();
public void Add(T first, T second, T third)
{
list.Add(Tuple.Create(first, second, third));
}
public IEnumerator<Tuple<T, T, T>> GetEnumerator()
{
return list.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Następujące będzie skompilować pomyślnie i utworzyć kolekcję z jedną 3-krotki:
var tuples = new TripleCollection<string>
{
{ "1", "2", "3" },
};
Można również wprowadzić następujące List
podklasy:
public class ListOfArray<T> : List<T[]>
{
public new void Add(params T[] args)
{
base.Add(args);
}
}
I zainicjuj go przy użyciu wymaganej składni:
var synonyms = new ListOfArray<string>
{
{ "enabled", "enable", "enabling" },
{ "disabled", "disable", "disabling" },
{ "s0", "s0 state" },
{ "s5", "s5 state" }
};
Ale List<string []>
, jak inni to zauważyli, trzeba zainicjować listy synonimy wyraźnie przydzielając każdy wpis string []
, zamiast niejawnego gromadzenia intializer dla każdego wpisu:
var synonyms = new List<string[]>
{
new [] { "enabled", "enable", "enabling" },
new [] { "disabled", "disable", "disabling" },
new [] { "s0", "s0 state" },
new [] { "s5", "s5 state" }
};
Jesteś prowadzącego swoją kolekcję jako słownik zamiast listy. –
Słowniki mogą zawierać tylko parę, w razie potrzeby mogę zawierać więcej niż jedną parę. – dukevin
W takim przypadku może być potrzebna niestandardowa klasa modelu, która przyjmuje lewą wartość, np. s0 lub s5, aw tym modelu niestandardowym dodaj synonimy, które są listą ciągów. To, co masz w tej chwili, nie zadziała. –