51

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

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

那么 C# 6.0 中有什么新内容,他们在 C# 6.0 中谈论的 Dictionary Initializer 是什么

4

3 回答 3

77

虽然您可以使用集合初始化器来初始化字典,但这很麻烦。特别是对于应该是语法糖的东西。

字典初始化器更简洁:

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

更重要的是,这些初始化器不仅仅用于字典,它们可以用于任何支持 indexer 的对象,例如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
于 2014-12-02T07:47:33.457 回答
3

只是为了强调最重要的区别,字典初始化程序调用索引器,因此它在遇到重复键时执行更新,而集合初始化程序调用Add将抛出的方法。

简要总结一下一般的差异:

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

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

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

    但不是

    new Dictionary<int, string>() 
    {
        { 1,"Pankaj" },
        { 2,"Pankaj" },
        { 3,"Pankaj" },
        Capacity = 100, // wont compile
    };
    
  3. 作为一个对象初始化器,索引初始化器可以用于任何具有索引器的类,而集合初始化器只能用于 IEnumerables,无论如何这应该是显而易见的。

  4. 集合初始化器可以使用自定义Add扩展方法来增强,而字典初始化器不能(C# 中还没有扩展索引器)。

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

  6. 字典初始化器是 C# 6.0 的特性,而集合初始化器从 C# 3.0 开始可用。

于 2020-03-06T12:48:44.610 回答
0

新正在以这种方式创建字典

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

取自AC# 6.0 语言预览

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

于 2014-12-02T07:47:03.737 回答