使用数组初始化List

时间:2015-12-03 22:39:30

标签: c# arrays string list

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

类似的东西:

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

的字符串数组,它就可以工作

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分: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" } 
    };

答案 2 :(得分:6)

List初始化程序创建隐式类型数组:

List<string[]> synonyms = new List<string[]> 
{
    new [] { "enabled", "enable", "enabling" },
    new [] { "disabled", "disable", "disabling" },
    new [] { "s0", "s0 state" },
    new [] { "s5", "s5 state" }
};
当数组中的对象类型都是new [] { ... }时,

new string[] { ... }等同于执行string。如果数组中对象的类型不同,您将使用隐式语法获得错误。

答案 3 :(得分:6)

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

  

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

因此,在语法

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

编译器期望您的集合具有Add(string, string, string)方法。因为List<string []>上没有这样的方法,所以编译失败。

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

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<string []>,您需要通过显式分配每个string []条目来初始化您的同义词列表,而不是为每个条目使用隐式集合初始化器:

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

答案 4 :(得分:5)

您需要指定内部对象是数组,以便它不会查找多参数Add方法。

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

答案 5 :(得分:1)

我认为你可能没有制作阵列的任何实例。

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