字典初始化程序在集合初始化程序中添加了哪些好处?

时间:2014-12-02 07:37:25

标签: c# dictionary collections c#-6.0 collection-initializer

最近有很多关于C#6.0的新内容的讨论 最受关注的功能之一是在C#6.0中使用Dictionary初始化器 但是等一下我们一直在使用集合初始化器来初始化集合,并且可以在.NET 4.0和.NET 4.5(不知道旧版本)中初始化Dictionary,如

Dictionary<int, string> myDict = new Dictionary<int, string>() {
    { 1,"Pankaj"},
    { 2,"Pankaj"},
    { 3,"Pankaj"}
};

那么C#6.0中有什么新东西,他们在C#6.0中讨论的是什么字典初始化器

3 个答案:

答案 0 :(得分:74)

虽然可以使用集合初始化程序初始化字典,但这非常麻烦。特别是对于那些应该是语法糖的东西。

字典初始化器更清晰:

var myDict = new Dictionary<int, string>
{
    [1] = "Pankaj",
    [2] = "Pankaj",
    [3] = "Pankaj"
};

更重要的是,这些初始化程序不仅适用于词典,它们可用于支持索引器的任何对象,例如List<T>

var array = new[] { 1, 2, 3 };
var list = new List<int>(array) { [1] = 5 };
foreach (var item in list)
{
    Console.WriteLine(item);
}

输出:

1
5
3

答案 1 :(得分:2)

仅强调最重要的区别,字典初始化器调用索引器,因此当遇到重复键时它执行更新,而集合初始化器调用将抛出的Tools.DiffFiles "FirstFile.cs" "SecondFile.cs"方法。

简要概述一般差异:

  1. 集合初始值设定项调用Add方法(对于IEnumerables),其中作为字典初始值设定项调用索引器。这具有字典的添加与更新语义差异。

  2. 字典初始化程序在技术上是对象初始化程序,因此可以与初始化其他属性混合使用。例如:

    Add

    但不是

    new Dictionary<int, string>
    {
        [1] = "Pankaj",
        [2] = "Pankaj",
        [3] = "Pankaj",
        Capacity = 100,
    };
    
  3. 仅是对象初始化程序,索引初始化程序可用于带有索引器的任何类,而集合初始化程序仅可用于IEnumerables,无论如何应该很明显。

  4. 可以使用自定义new Dictionary<int, string>() { { 1,"Pankaj" }, { 2,"Pankaj" }, { 3,"Pankaj" }, Capacity = 100, // wont compile }; 扩展方法来增强集合初始化程序,而不能使用字典初始化程序(C#中尚无扩展索引器)。

  5. 字典初始化程序在初始化字典时可能在主观上更具可读性:)

  6. 词典初始值设定项是C#6.0功能,而集合初始值设定项可从C#3.0开始使用。

答案 2 :(得分:0)

New以这种方式创建字典

Dictionary<int, string> myDict = new Dictionary<int, string>() {
    [1] = "Pankaj",
    [2] = "Pankaj",
    [3] = "Pankaj"
};

的风格为<index> = <value>

已过时:字符串索引成员语法(如评论中所述)

Dictionary<int, string> myDict = new Dictionary<int, string>() {
        $1 = "Pankaj",
        $2 = "Pankaj",
        $3 = "Pankaj"
    };

取自A C# 6.0 Language Preview

  

要理解$运算符,请查看AreEqual函数调用。注意在builtInDataTypes变量上调用“$ Boolean”的Dictionary成员 - 即使Dictionary上没有“Boolean”成员。这样的显式成员不是必需的,因为$运算符调用字典上的索引成员,相当于调用buildInDataTypes [“Boolean”]。