【问题标题】:Proper way to initialize a C# dictionary with values用值初始化 C# 字典的正确方法
【发布时间】:2021-11-22 08:24:43
【问题描述】:

我正在使用以下代码在 C# 文件中创建字典:

private readonly Dictionary<string, XlFileFormat> FILE_TYPE_DICT
        = new Dictionary<string, XlFileFormat>
        {
            {"csv", XlFileFormat.xlCSV},
            {"html", XlFileFormat.xlHtml}
        };

new下方有一条红线提示错误:

无法使用功能“集合初始化器”,因为它不是 ISO-2 C# 语言规范的一部分

这是怎么回事?

我使用的是 .NET 版本 2。

【问题讨论】:

  • 更改目标框架版本或使用“旧”的初始化方式。
  • 您将此代码放在什么上下文中?由 Visual Studio 编译的 .cs 文件,还是在 .cshtml 中?你的project file have a languageVersion element

标签: c# dictionary


【解决方案1】:

我无法在简单的 .NET 4.0 控制台应用程序中重现此问题:

static class Program
{
    static void Main(string[] args)
    {
        var myDict = new Dictionary<string, string>
        {
            { "key1", "value1" },
            { "key2", "value2" }
        };

        Console.ReadKey();
    }
}

你能尝试在一个简单的控制台应用程序中重现它并从那里开始吗?您的目标似乎很可能是 .NET 2.0(不支持它)或客户端配置文件框架,而不是支持初始化语法的 .NET 版本。

【讨论】:

  • 问题是 OP 使用的 C# 版本,直到 C# 3.0 才引入对象/集合初始化程序。关于它之前为什么不起作用的详细信息已经是answered
  • 如何查看或更改我使用的 C# 版本?
  • 项目的属性会指明框架的目标版本。
  • 您使用的 Visual Studio 版本通常是一个很好的指标 - 请参阅此处查看 reference
  • @James - 然而,这并不可靠,因为这个人可能会在一个针对 2.0 的解决方案中进行一些遗留工作,并且不知道它。
【解决方案2】:

使用 C# 6.0,您可以通过以下方式创建字典:

var dict = new Dictionary<string, int>
{
    ["one"] = 1,
    ["two"] = 2,
    ["three"] = 3
};

它甚至适用于自定义类型。

【讨论】:

  • 对于对这种新语法更感兴趣的人,这里有一篇不错的博文:marcin-chwedczuk.github.io/…
  • 我更喜欢你的方式,但请注意,它每行 (4) 使用与 { "key2", "value2" },
【解决方案3】:

您可以内联初始化Dictionary(和其他集合)。每个成员都包含在大括号中:

Dictionary<int, StudentName> students = new Dictionary<int, StudentName>
{
    { 111, new StudentName { FirstName = "Sachin", LastName = "Karnik", ID = 211 } },
    { 112, new StudentName { FirstName = "Dina", LastName = "Salimzianova", ID = 317 } },
    { 113, new StudentName { FirstName = "Andy", LastName = "Ruth", ID = 198 } }
};

详情请见How to initialize a dictionary with a collection initializer (C# Programming Guide)

【讨论】:

  • 对于什么版本的 C#?是在第一个版本中出现还是后来推出的?
  • 我喜欢你使用varAdd()
【解决方案4】:

假设我们有一个这样的字典:

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Mohan");
dict.Add(2, "Kishor");
dict.Add(3, "Pankaj");
dict.Add(4, "Jeetu");

我们可以如下初始化它。

Dictionary<int, string> dict = new Dictionary<int, string>
{
    { 1, "Mohan" },
    { 2, "Kishor" },
    { 3, "Pankaj" },
    { 4, "Jeetu" }
};

【讨论】:

  • ReSharper 的答案。
【解决方案5】:

对象初始值设定项是在 C# 3.0 中引入的。检查您所针对的框架版本。

Overview of C# 3.0

【讨论】:

    【解决方案6】:

    请注意,C# 9 允许Target-typed new expressions,因此如果您的变量或类成员不是抽象类或接口类型,则可以避免重复:

        private readonly Dictionary<string, XlFileFormat> FILE_TYPE_DICT = new ()
        {
            { "csv", XlFileFormat.xlCSV },
            { "html", XlFileFormat.xlHtml }
        };
    

    【讨论】:

      【解决方案7】:

      使用С# 6.0

      var myDict = new Dictionary<string, string>
      {
          ["Key1"] = "Value1",
          ["Key2"] = "Value2"
      };
      

      【讨论】:

      • 您的答案(在 Turbcool 编辑之前)是 Haney 接受的答案的精确副本。请确保未来的答案为问题提供新的解决方案。
      • @TylerH 答案是独一无二的,因为我建议使用基于索引器的方法(使用来自已接受答案的变量)。但答案不是副本。请参考编辑历史。
      【解决方案8】:

      代码看起来不错。只需尝试将 .NET 框架更改为 v2.0 或更高版本。

      【讨论】:

      • 这只是重复了近十年前几个人给出的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2019-10-24
      • 2019-10-03
      相关资源
      最近更新 更多