开发者

How to add value for Complex Dictionary?

开发者 https://www.devze.com 2022-12-15 02:23 出处:网络
As i know, the method to add values for dictionary as below. Dictionary<string, string> myDict = new Dictionary<string, string>();

As i know, the method to add values for dictionary as below.

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

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

If I declared "myDictDict" as the style below.

IDictionary开发者_开发知识库<string, Dictionary<string, string>> myDictDict = new Dictionary<string, Dictionary<string, string>>();

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

thank you.


The proper way is like this:

// 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");

This will extract the dictionary corresponding to the key (hello in your example) or create it if necessary and then will add the key/value pair to that dictionary. You could even extract this into an extension method.

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);
    }
}

I left out guarding against null input to keep the idea clear. Usage:

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

or

myDictDict.AddToNesteDictionary("hello", "tom", "cat");


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);


You can use C# 3's collection initializers, like this:

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

If the dictionary already exists, you can write

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

Note that this will only work if hello isn't an existing key in the outer dictionary. If it might be, you should use Jason's answer.


To handle this the "simple" way : something like this :

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

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

To respond directly to the OP's test case : (note the edit added below reflects a desire to correct the syntax of SLaks's answer : code tested and validated against Framework 3.5 Client profile in 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" }});


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");


You can define an extension method like this :

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}};
}

and then use it as :

myDictDict.Add("hello", "tom","cat");
0

精彩评论

暂无评论...
验证码 换一张
取 消