使用数组初始化列表
本文关键字:列表 初始化 数组 | 更新日期: 2023-09-27 18:25:31
我想在编译时填充字符串数组列表
像这样:
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>
的字符串数组,它可以工作
您没有在示例中创建数组,请尝试以下操作:
List<string[]> synonyms = new List<string[]>
{
new[] { "enabled", "enable", "enabling" },
new[] { "disabled", "disable", "disabling" },
new[] { "s0", "s0 state" },
new[] { "s5", "s5 state" }
};
你需要添加一个字符串数组
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" }
};
代码不起作用的原因在如何:使用集合初始值设定项初始化字典(C# 编程指南(中详细说明:
字典包含键/值对的集合。它的 Add 方法采用两个参数,一个用于键,一个用于值。要初始化字典或其 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" }
};
为 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[] { ... }
。如果数组中对象的类型不同,则使用隐式语法时将收到错误。
您需要指定内部对象是数组,以便它不会查找多参数 Add 方法。
List<string[]> synonyms = new List<string[]>
{
new[] { "enabled", "enable", "enabling" },
new[] { "disabled", "disable", "disabling" },
new[] { "s0", "s0 state" },
new[] { "s5", "s5 state" }
};
我认为可能是您没有创建数组的任何实例。
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" }}
};