C#字典模式,哪个最好?

时间:2011-06-11 14:35:50

标签: c# dictionary

哪种模式应优先于其他模式?为什么?

foreach(KeyValuePair<string, Dictionary<string, string>> data in
    new Dictionary<string, Dictionary<string, string>> { 
        {"HtmlAttributes", this.HtmlAttributes},
        {"Content", this.Content}
    }) 
{
     foreach(KeyValuePair<string, string> entry in data.Value)
     {
         // do something
     }
}

Dictionary<string, Dictionary<string, string>> data = new Dictionary<string, Dictionary<string, string>>();
data.Add("HtmlAttributes", this.HtmlAttributes);
data.Add("Content", this.Content);

foreach(KeyValuePair<string, IDictionary<string, string>> entry in data) 
{
    // Do something
}           

data.Clear(); // not sure if this is needed either
data = null;  // gc object 

请不要回答“use var”,因为我不喜欢使用它。

回复:var(2年后):我必须添加一些内容才能做到这一点。回想起来,阅读Eric Lipert关于何时以及为何使用var的博客文章是完全有道理的。如果使用得当,意味着并非所有时间,它都非常有意义,它缩短了需要阅读的代码量。关于使用什么初始化的问题,对象初始化器很好,但是从foreach或其他处理中分离初始化会使代码更具可读性。

3 个答案:

答案 0 :(得分:3)

我认为Kent Boogaart和quakkels的评论是正确的。 var在这里有意义。如果我不得不选择你的两个中的一个我会说第二个更好,因为它更容易阅读。

答案 1 :(得分:1)

我更喜欢你的两个版本之间的东西:分割创建和迭代,但使用集合初始化器。

Dictionary<string, Dictionary<string, string>> dicts =
    new Dictionary<string, Dictionary<string, string>> { 
    {"HtmlAttributes", this.HtmlAttributes},
    {"Content", this.Content}
});

foreach(KeyValuePair<string, Dictionary<string, string>> data in dicts)
{
     foreach(KeyValuePair<string, string> entry in data.Value)
     {
         // do something
     }
}

或等效(实际上,从编译器和IDE的角度来看,以下内容完全相同):

var dicts = new Dictionary<string, Dictionary<string, string>> { 
    {"HtmlAttributes", this.HtmlAttributes},
    {"Content", this.Content}
});

foreach(var data in dicts)
{
     foreach(var entry in data.Value)
     {
         // do something
     }
}

此外,如果您使用Dictionary作为对的列表,则可以使用List<KeyValuePair<K, V>>或(在.Net 4上)List<Tuple<T1, T2>>

答案 2 :(得分:0)

我认为您的第二个版本更具可读性。鉴于您不喜欢使用var,这似乎更重要,因为您的第一个版本让我头疼。

我还认为将创建集合的代码与循环它的代码混合在一起有点令人费解。

所以,对我来说,这是一个可读性的问题,我更喜欢第二个版本。但最终,任何一个都有效。