【问题标题】:Initializing a List with arrays用数组初始化列表
【发布时间】:2016-03-08 18:03:13
【问题描述】:

我想在编译时填充一个字符串数组列表

类似这样的:

        List<string[]> synonyms = new List<string[]> 
        {
            { "enabled", "enable", "enabling" },
            { "disabled", "disable", "disabling" },
            { "s0", "s0 state" },
            { "s5", "s5 state" }
        };

但我得到一个编译错误: No overloaded method 'Add' takes 2 arguments

这是为什么?如果它们不是带有 List&lt;string&gt; 的字符串数组,它就可以工作

【问题讨论】:

  • 您将收藏视为字典而不是列表。
  • 字典只能包含一对,如果需要我希望能够包含多对
  • 在这种情况下,您可能需要一些自定义模型类来获取您的左值,例如。 s0 或 s5,并在该自定义模型中添加作为字符串列表的同义词。你现在拥有的东西是行不通的。
  • 我不希望左值的处理方式与其他同义词不同。基本上我们有一个庞大的代码库,我需要使“启用”==“启用”

标签: c# arrays string list


【解决方案1】:

您没有在示例中创建数组,请尝试以下操作:

    List<string[]> synonyms = new List<string[]> 
    {
        new[] { "enabled", "enable", "enabling" },
        new[] { "disabled", "disable", "disabling" },
        new[] { "s0", "s0 state" },
        new[] { "s5", "s5 state" }
    };

【讨论】:

    【解决方案2】:

    你需要添加一个字符串数组

    List<string[]> synonyms = new List<string[]> 
        {
            new string[] { "enabled", "enable", "enabling" },
            new string[] { "disabled", "disable", "disabling" },
            new string[] { "s0", "s0 state" },
            new string[] { "s5", "s5 state" } 
        };
    

    【讨论】:

      【解决方案3】:

      How to: Initialize a Dictionary with a Collection Initializer (C# Programming Guide) 中说明了您的代码工作的原因:

      字典包含键/值对的集合。它的 Add 方法有两个参数,一个是键,一个是值。要初始化字典,或任何 Add 方法采用多个参数的集合,请将每组参数括在大括号中...

      因此,在语法中

          {
              { "enabled", "enable", "enabling" },
          }
      

      编译器希望您的集合具有Add(string, string, string) 方法。因为List&lt;string []&gt;上没有这个方法,所以你的编译失败。

      实际上,可以创建这样的集合并使用这种语法对其进行初始化。如果您创建以下集合:

      public class TripleCollection<T> : IEnumerable<Tuple<T, T, T>>
      {
          readonly List<Tuple<T, T, T>> list = new List<Tuple<T, T, T>>();
      
          public void Add(T first, T second, T third)
          {
              list.Add(Tuple.Create(first, second, third));
          }
      
          public IEnumerator<Tuple<T, T, T>> GetEnumerator()
          {
              return list.GetEnumerator();
          }
      
          System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
          {
              return GetEnumerator();
          }
      }
      

      以下将成功编译并创建一个包含一个 3 元组的集合:

              var tuples = new TripleCollection<string>
              {
                  { "1", "2", "3" },
              };
      

      您还可以创建以下List 子类:

      public class ListOfArray<T> : List<T[]>
      {
          public new void Add(params T[] args)
          {
              base.Add(args);
          }
      }
      

      并使用所需的语法对其进行初始化:

              var synonyms = new ListOfArray<string>
              {
                  { "enabled", "enable", "enabling" },
                  { "disabled", "disable", "disabling" },
                  { "s0", "s0 state" },
                  { "s5", "s5 state" }
              };
      

      但是对于List&lt;string []&gt;,正如其他人所指出的,您需要通过显式分配每个string [] 条目来初始化同义词列表,而不是为每个条目使用隐式集合初始化器:

              var synonyms = new List<string[]>
              {
                  new [] { "enabled", "enable", "enabling" },
                  new [] { "disabled", "disable", "disabling" },
                  new [] { "s0", "s0 state" },
                  new [] { "s5", "s5 state" }
              };
      

      【讨论】:

        【解决方案4】:

        为您的 List 初始化器创建隐式类型数组:

        List<string[]> synonyms = new List<string[]> 
        {
            new [] { "enabled", "enable", "enabling" },
            new [] { "disabled", "disable", "disabling" },
            new [] { "s0", "s0 state" },
            new [] { "s5", "s5 state" }
        };
        

        new [] { ... }等价于当数组中的对象类型都是string时做new string[] { ... }。如果数组中对象的类型不同,使用隐式语法会报错。

        【讨论】:

          【解决方案5】:

          您需要指定内部对象是数组,这样它就不会寻找多参数的 Add 方法。

              List<string[]> synonyms = new List<string[]> 
              {
                  new[] { "enabled", "enable", "enabling" },
                  new[] { "disabled", "disable", "disabling" },
                  new[] { "s0", "s0 state" },
                  new[] { "s5", "s5 state" }
              };
          

          【讨论】:

            【解决方案6】:

            我认为可能是您没有创建任何数组实例。

                 List<string[]> synonyms = new List<string[]>
                {
                   {new string[] { "enabled", "enable", "enabling" }},
                   {new string[] { "disabled", "disable", "disabling" }},
                   {new string[] { "s0", "s0 state" }},
                   {new string[] { "s5", "s5 state" }}
                };
            

            【讨论】:

              猜你喜欢
              • 2011-06-05
              • 2023-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-10-09
              • 1970-01-01
              • 2015-02-07
              • 1970-01-01
              相关资源
              最近更新 更多