Я не могу понять синтаксис для инициализации встроенной коллекции для:
var a = new List<KeyValuePair<string, string>>();
Я не могу понять синтаксис для инициализации встроенной коллекции для:
var a = new List<KeyValuePair<string, string>>();
Довольно просто:
var a = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("A","B"),
new KeyValuePair<string, string>("A","B"),
new KeyValuePair<string, string>("A","B"),
};
Обратите внимание, что после последнего элемента вы можете оставить конечную запятую (возможно, потому, что создатели .net хотели упростить создание кода), или удалите скобки ()
конструктора списка и код все еще компилируется.
Обратите внимание, что инициализация коллекции словарей { { key1, value1 }, { key2, value2 } }
зависит от метода Dictionary Add(TKey, TValue)
. Вы не можете использовать этот синтаксис в списке, потому что ему не хватает этого метода, но вы можете сделать подкласс с помощью метода:
public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>>
{
public void Add(TKey key, TValue value)
{
Add(new KeyValuePair<TKey, TValue>(key, value));
}
}
public class Program
{
public static void Main()
{
var list = new KeyValueList<string, string>
{
{ "key1", "value1" },
{ "key2", "value2" },
{ "key3", "value3" },
};
}
}
Другая альтернатива, которая не требует создания подкласса:
List<KeyValuePair<String, String>> list = new Dictionary<String, String>
{
{"key1", "value1"},
{"key2", "value2"},
}.ToList();
Как упоминалось в комментариях: недостатки с этим методом включают возможную потерю порядка и невозможность добавления повторяющихся ключей.
Так как инициализаторы коллекций (С# 6.0) здесь не упоминались:
Реализация
public static class InitializerExtensions
{
public static void Add<T1, T2>(this ICollection<KeyValuePair<T1, T2>> target, T1 item1, T2 item2)
{
if (target == null)
throw new ArgumentNullException(nameof(target));
target.Add(new KeyValuePair<T1, T2>(item1, item2));
}
}
Использование
var list = new List<KeyValuePair<string, string>> { {"ele1item1", "ele1item2"}, { "ele2item1", "ele2item2" } };
Как заставить его работать
Просто включите правильные выражения using
в свой файл, чтобы InitializerExtensions
был доступен (это означает, что вы можете явно вызвать InitializerExtensions.Add
), а синтаксис специального инициализатора коллекции станет доступен, если вы используете VS 2015 или выше.
Любая инициализация выполняется с помощью object(params_if_exist) { any public member or instance};
f.e. var list = new List<int> {1,2,3};
var bw = new BackgroundWorker() {WorkerSupportsCancellation = true};