C#字典模式,这是最好的

本文关键字:字典 模式 | 更新日期: 2023-09-27 17:59:06

这些模式中的哪一个应该优先于其他模式,为什么?

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 

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

回复:var(2年后):我必须添加一些内容来纠正这一点。回想起来,阅读Eric Lipert关于何时以及为什么使用var的博客文章是完全有意义的。如果使用得当,也就是说不是所有时间,它都很有意义,而且它缩短了人们需要阅读的代码量。在使用什么初始化的问题上,对象初始化器是可以的,但将初始化与foreach或其他处理分开会使代码更具可读性。

C#字典模式,这是最好的

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

我更喜欢介于两个版本之间的东西:拆分创建和迭代,但使用集合初始值设定项。

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

我认为您的第二个版本可读性更强。考虑到您不喜欢使用var,这似乎更重要,因为您的第一个版本有点让我头疼。

我还认为,将创建集合的代码与循环通过集合的代码混合在一起有点复杂

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