我只想要通过不仅指定值,而且指定它们将附加到的索引来初始化string []数组常量。
例如,在:
private static readonly string [] Pets = new string [] {“Bulldog”,“GreyHound”};
我想说BullDog对应索引29而GreyHound对应5(喜欢php :))
有什么建议吗?
干杯,
答案 0 :(得分:7)
如果您在数据结构方面具有一定的灵活性,那么使用Dictionary<int, string>
代替数组来实现此行为会更有效。
示例(如果您使用的是C#3或更高版本):
var pets = new Dictionary<int, string> {
{ 29, "Bulldog" },
{ 5, "Greyhound" }
};
Console.WriteLine(pets[5]);
遗留应用程序的相同示例:
Dictionary<int, string> pets = new Dictionary<int, string>();
pets[29] = "Bulldog";
pets[5] = "Greyhound";
Console.WriteLine(pets[5]);
答案 1 :(得分:6)
听起来你不想要一个数组,而是一个Dictionary<int, string>
,它可以像这样初始化:
private static readonly Dictionary<int, string> pets =
new Dictionary<int, string> {
{ 29, "Bulldog" },
{ 5, "Greyhound" }
};
(请注意,此集合初始化程序语法仅在C#3中添加。如果您使用的是旧版本,则必须多次显式调用Add
或索引器。 )
您可以通过其索引器访问字典,该字典看起来像是数组访问:
string x = pets[29];
pets[10] = "Goldfish";
答案 2 :(得分:1)
在声明数组时,我不认为你想要的是什么。
除了使用其他人建议的Dictionary
之外,您可以尝试使用枚举,其值与您对应于字符串值的特定数组索引和描述(使用Description
属性)相对应。
private enum Pets
{
[Description("GreyHound")]
Greyhound = 5,
[Description("Bulldog")]
Bulldog = 29
}
答案 3 :(得分:1)
为了记录,我同意每个人Dictionary
可能更合适。但你可以写一点方法来实现你想要的东西:
public static T[] CreateArray<T>(params Tuple<int, T>[] values)
{
var sortedValues = values.OrderBy(t => t.Item1);
T[] array = new T[sortedValues.Last().Item1 + 1];
foreach(var value in sortedValues)
{
array[value.Item1] = value.Item2;
}
return array;
}
并称之为:
string[] myArray = CreateArray(new Tuple<int, string>(34, "cat"), new Tuple<int, string>(12, "dog"));
如果C#收到许多人似乎想要的Tuple
语法糖,那么这样会更清晰。
这是个好主意吗?几乎可以肯定没有,但我会留下那个让OP来判断。
答案 4 :(得分:0)
您不需要字符串数组,而是需要Dictionary
。
看看link text,那里有一个很好的例子(我在这里改编):
Dictionary<int, string> d = new Dictionary<int, string>();
d.Add(2, "cat");
d.Add(1, "dog");
d.Add(0, "llama");
d.Add(-1, "iguana");
答案 5 :(得分:0)
您无法在初始化程序中执行此操作,您需要先指定数组的大小,然后在特定位置添加项目。
private static readonly string[] Pets = new string[42];
然后在静态构造函数中插入项目。
private static MyClass
{
Pets[29] = "Bulldog";
Pets[5] = "Greyhound";
}
但正如其他人所建议的那样:使用Dictionary<int, string>
。