使用数组初始化列表

9
我希望在编译时填充一个字符串数组列表。
类似这样的代码:
        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>,那么它就能正常工作。


你把你的集合当作字典而不是列表来处理。 - Huske
字典只能包含一对键值,如果需要的话,我希望能够包含多对键值。 - dukevin
在这种情况下,您可能需要一些自定义模型类来获取您的左值,例如s0或s5,并在该自定义模型中添加同义词列表。您目前拥有的内容无法正常工作。 - Huske
我不希望左值与其他同义词有所不同。基本上,我们有一个庞大的代码库,我需要让“enabled”等于“enable”。 - dukevin
6个回答

8

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

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

7

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

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

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 [] { ... } 等同于在数组中所有对象的类型都是 string 时执行 new string[] { ... }。如果数组中的对象类型不同,使用隐式语法将导致错误。


6
你的代码为什么无法运行在“如何使用集合初始化器(C#编程指南)”中有详细说明:

一个Dictionary包含一组键/值对。它的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" }
        };

5

您需要指定内部对象为数组,以便它不会寻找多参数添加方法。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接