Как добавить несколько значений в словарь в С#

Каков наилучший способ добавить несколько значений в словарь, если я не хочу вызывать ".Add()" несколько раз. Изменить: я хочу заполнить его после инициации! в словаре уже есть некоторые значения!

Итак, вместо

    myDictionary.Add("a", "b");
    myDictionary.Add("f", "v");
    myDictionary.Add("s", "d");
    myDictionary.Add("r", "m");
    ...

Я хочу сделать что-то вроде этого

 myDictionary.Add(["a","b"], ["f","v"],["s","d"]);

Есть ли способ сделать так?

Ответ 1

Для этого вы можете использовать фигурные скобки, хотя это работает только для инициализации:

var myDictionary = new Dictionary<string, string>
{
    {"a", "b"},
    {"f", "v"},
    {"s", "d"},
    {"r", "m"}
};

Это называется "инициализацией коллекции" и работает для любого ICollection<T> (см. ссылка для словарей или это ссылка для любого другого типа коллекции). Фактически, он работает для любого типа объекта, который реализует IEnumerable и содержит метод Add:

class Foo : IEnumerable
{
    public void Add<T1, T2, T3>(T1 t1, T2 t2, T3 t3) { }
    // ...
}

Foo foo = new Foo
{
    {1, 2, 3},
    {2, 3, 4}
};

В основном это просто синтаксический сахар для многократного вызова метода Add. После инициализации существует несколько способов сделать это, один из которых вызывает методы Add вручную:

var myDictionary = new Dictionary<string, string>
    {
        {"a", "b"},
        {"f", "v"}
    };

var anotherDictionary = new Dictionary<string, string>
    {
        {"s", "d"},
        {"r", "m"}
    };

// Merge anotherDictionary into myDictionary, which may throw
// (as usually) on duplicate keys
foreach (var keyValuePair in anotherDictionary)
{
    myDictionary.Add(keyValuePair.Key, keyValuePair.Value);
}

Или как метод расширения:

static class DictionaryExtensions
{
    public static void Add<TKey, TValue>(this IDictionary<TKey, TValue> target, IDictionary<TKey, TValue> source)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (target == null) throw new ArgumentNullException("target");

        foreach (var keyValuePair in source)
        {
            target.Add(keyValuePair.Key, keyValuePair.Value);
        }
    }
}

var myDictionary = new Dictionary<string, string>
    {
        {"a", "b"},
        {"f", "v"}
    };

myDictionary.Add(new Dictionary<string, string>
    {
        {"s", "d"},
        {"r", "m"}
    });

Ответ 2

Это не совсем повторяющийся вопрос, но то, что вы, вероятно, хотите, - это метод Dictionary.AddRange(). И вот почему этого не существует:

Почему у словаря нет AddRange?

"Диапазон не имеет никакого значения для ассоциативного контейнера".

Но может быть хорошей идеей написать свой собственный метод .AddRange() для класса Dictionary. По сути, это будет цикл вызовов .Add().

Ответ 3

Хотя на вопрос был дан ответ, мне было любопытно, можно ли применить синтаксис, похожий на инициализатор, в словарь, который уже был инициализирован без создания/накладных расходов, для создания второго словаря для слияния и выброса.

Вы можете использовать (злоупотреблять?) Инициализаторы коллекции, чтобы добавить ряд значений в существующий Словарь после его создания. Как? Создав для этого класс-помощник:

public class AddRangeTo<TKey, TValue> : IEnumerable
{
    private readonly IDictionary<TKey, TValue> WrappedDictionary;

    public AddRangeTo(IDictionary<TKey, TValue> wrappedDictionary)
    {
        this.WrappedDictionary = wrappedDictionary;
    }

    public void Add(TKey key, TValue value)
    {
        this.WrappedDictionary.Add(key, value);
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotSupportedException();
    }
}

С использованием:

var myDictionary = new Dictionary<string, string>();

new AddRangeTo<string, string>(myDictionary)
{
    {"a", "b"},
    {"f", "v"},
    {"s", "d"},
    {"r", "m"}
};

Обратите внимание, что это позволяет добавлять записи в словарь с использованием аналогичного синтаксиса, но в словарь, который уже был инициализирован. Часть такого рода отстой является повторением генераторов <string, string>, но это не понадобится, если С# 6.0. (EDIT: То есть, в С# 6 это будет выглядеть как new AddRangeTo(myDictionary)) (EDIT: эта функция была отменена с С# 6)

Что все сказано, я действительно не рекомендую делать это обязательно. Это нечетный синтаксис/использование с неожиданными побочными эффектами, и я думаю, что это может смущать других, когда они сталкиваются с этим. Но если вы обнаружите, что на самом деле вы это используете, и ваш внутренний код будет проще использовать и поддерживать, то бонус!

Ответ 4

Вы можете сделать это следующим образом:

var myDict = new Dictionary<string, string>() 
{
    {"a", "aa"},
    {"b", "bb"},
    {"c", "cc"},
    {"d", "dd"}
};

Ответ 5

Вы можете сделать это при инициализации, как и в любом другом ответе ответа, или вы можете комбинировать его с этим трюком:

Dictionary<string, string> myDictionary = new Dictionary<string, string>();
Dictionary<string, string> secondDictionary = new Dictionary<string, string>()
{ 
    {"1", "a"}, 
    {"2", b"} 
};
myDictionary = myDictionary.Union(secondDictionary)
                           .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

Вы должны убедиться, что нет дубликатов ключей, или вы получите исключение (но это то же самое с методом Add).

Ответ 6

Это был бы простой поиск в Google: http://msdn.microsoft.com/en-us/library/bb531208.aspx. В любом случае... вот код:

Dictionary<string, string> myDictionary = new Dictionary<string, string>()
{
    { 'a', 'b' },
    { 'c', 'd' },
    { 'e', 'f' }
};

Конечно, вы также можете написать цикл или что-то, чтобы перебирать ваши значения и каждый раз вызывать метод .add().

Ответ 7

Ну, вы можете при инициализации:

new Dictionary<string, string> { {"a","b"}, {"f","v"},{"s","d"} }

Это называется инициализатором коллекции. Если вы хотите добавить несколько элементов в уже существующий словарь, вы можете написать метод.

Ответ 8

Это может быть сделано из основного пути кода таким способом, который позволяет уменьшить беспорядок, где это происходит, используя методы расширения.

public static class DictionaryExtensions
{
  public static IDictionary<TKey,TValue> AddRange<TKey,TValue>(
               this IDictionary<TKey,TValue> source,
               params  KeyValuePair<TKey,TValue>[] items)
  {
    foreach (var keyValuePair in items)
    {
      source.Add(keyValuePair.Key, keyValuePair.Value);
    }
    return source;
  }
}

Ответ 9

myDictionary = новый словарь() {{ "a", 2)}, { "b", 3},};