Как увеличить стоимость для Сложного Словаря?

Поскольку я знаю, метод к добавленным стоимостям для словаря как ниже.

    Dictionary<string, string> myDict = new Dictionary<string, string>();

    myDict.Add("a", "1");

Если я объявил "myDictDict" как стиль ниже.

IDictionary<string, Dictionary<string, string>> myDictDict = new Dictionary<string, Dictionary<string, string>>();

myDictDict .Add("hello", "tom","cat"); ?// How to add value here.

спасибо.

5
задан Nano HE 28 December 2009 в 03:13
поделиться

6 ответов

IDictionary<string,Dictionary<string,string>> myDictDict = new Dictionary<string,Dictionary<string,string>>();
Dictionary<string,string> dict = new Dictionary<string, string>();
dict.Add ("tom", "cat");
myDictDict.Add ("hello", dict);
5
ответ дан 18 December 2019 в 08:28
поделиться

Правильный способ:

// myDictDict is Dictionary<string, Dictionary<string, string>>
Dictionary<string, string> myDict;
string key = "hello";
if (!myDictDict.TryGetValue(key, out myDict)) {
    myDict = new Dictionary<string, string>();
    myDictDict.Add(key, myDict);
}
myDict.Add("tom", "cat");

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

static class Extensions {
    public static void AddToNestedDictionary<TKey, TNestedDictionary, TNestedKey, TNestedValue>(
        this IDictionary<TKey, TNestedDictionary> dictionary,
        TKey key,
        TNestedKey nestedKey,
        TNestedValue nestedValue
    ) where TNestedDictionary : IDictionary<TNestedKey, TNestedValue> {
        dictionary.AddToNestedDictionary(
            key,
            nestedKey,
            nestedValue,
            () => (TNestedDictionary)(IDictionary<TNestedKey, TNestedValue>)
                new Dictionary<TNestedKey, TNestedValue>());
    }

    public static void AddToNestedDictionary<TKey, TNestedDictionary, TNestedKey, TNestedValue>(
        this IDictionary<TKey, TNestedDictionary> dictionary,
        TKey key,
        TNestedKey nestedKey,
        TNestedValue nestedValue,
        Func<TNestedDictionary> provider
    ) where TNestedDictionary : IDictionary<TNestedKey, TNestedValue> {
        TNestedDictionary nested;
        if (!dictionary.TryGetValue(key, out nested)) {
            nested = provider();
            dictionary.Add(key, nested);
        }
        nested.Add(nestedKey, nestedValue);
    }
}

Я пропустил защиту от ввода null, чтобы сохранить идею ясной. Использование:

myDictDict.AddToNestedDictionary(
    "hello",
    "tom",
    "cat",
    () => new Dictionary<string, string>()
);

или

myDictDict.AddToNesteDictionary("hello", "tom", "cat");
8
ответ дан 18 December 2019 в 08:28
поделиться

Для того, чтобы справиться с этим "простым" способом : что-то вроде этого :

    myDictDict.Add("some string", new Dictionary<string, string>());

    myDictDict["some string"].Add("another", "string");

Для того, чтобы ответить непосредственно на тестовый случай OP : (обратите внимание, что добавленная ниже правка отражает желание исправить синтаксис ответа SLaks : код протестирован и валидирован против Framework 3. 5 Профиль клиента в VS 2010 Beta 2)

    // a simple case of creating an instance of a dictionary
    // of type <string, string>
    // and using .NET 3.0's (FrameWork => 3.5) collection initializer syntax
    Dictionary<string, string> twoStringDict = new Dictionary<string, string>()
    {
      {"key one", "value one"},
      {"key two", "value two"}, // note : an "extra" comma does not cause an error here
    };

    // more complex case as in the question on StackOverFlow
    // where dictionary is type <string, Dictionary<string, string>>
    // and using .NET 3.0's (FrameWork => 3.5) collection initializer syntax
    Dictionary<string, Dictionary<string, string>> myDictDict = new Dictionary<string, Dictionary<string, string>>()
    {
      { "key one",
            new Dictionary<string, string>() { { "innerKeyOne", "innerValueOne" }}},
      { "key two",
            new Dictionary<string, string>() { { "innerKeyTwo", "innerValueTwo" }}}
    };

    // syntax for adding another key value pair to the complex case
    myDictDict.Add("key three", new Dictionary<string, string>() { { "innerKeyThree", "innerValueThree" }});
2
ответ дан 18 December 2019 в 08:28
поделиться
IDictionary<string, Dictionary<string, string>> myDictDict = new Dictionary<string, Dictionary<string, string>>();

var subDict = new Dictionary<string, string>();
myDictDict .Add("hello", subDict ); 
subDict.Add("tom", "cat");
1
ответ дан 18 December 2019 в 08:28
поделиться

Вы можете использовать инициализаторы коллекции C# 3, например:

IDictionary<string, Dictionary<string, string>> myDictDict = new Dictionary<string, Dictionary<string, string>> {
    { "hello", new Dictionary<string, string> { "Tom", "Cat" } }
};

Если словарь уже существует, вы можете написать

dict.Add("hello", new Dictionary<string, string> { "Tom", "Cat" });

Обратите внимание, что это сработает только в том случае, если hello не является существующим ключом во внешнем словаре. Если это возможно, вам следует использовать ответ Джейсона.

.
2
ответ дан 18 December 2019 в 08:28
поделиться

Можно определить такой метод расширения :

static void Add(this IDictionary<string, Dictionary<string, string>> dict, string a, string b, string c){
    dict.Add(a, new Dictionary<string,string>(){{b,c}};
}

и затем использовать его как :

myDictDict.Add("hello", "tom","cat");
1
ответ дан 18 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: