Подтвердить что ты не робот

Как вы используете инициализаторы объектов для списка пар значений ключа?

Я не могу понять синтаксис для инициализации встроенной коллекции для:

var a = new List<KeyValuePair<string, string>>();
4b9b3361

Ответ 1

Довольно просто:

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 хотели упростить создание кода), или удалите скобки () конструктора списка и код все еще компилируется.

Ответ 2

Обратите внимание, что инициализация коллекции словарей { { 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" },
                   };
    }
}

Ответ 3

Другая альтернатива, которая не требует создания подкласса:

List<KeyValuePair<String, String>> list = new Dictionary<String, String>
    {
        {"key1", "value1"},
        {"key2", "value2"},
    }.ToList();

Как упоминалось в комментариях: недостатки с этим методом включают возможную потерю порядка и невозможность добавления повторяющихся ключей.

Ответ 4

Так как инициализаторы коллекций (С# 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 или выше.

Ответ 5

Любая инициализация выполняется с помощью 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};