Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何初始化指定所需索引的数组常量_C#_Arrays_Constants - Fatal编程技术网

C# 如何初始化指定所需索引的数组常量

C# 如何初始化指定所需索引的数组常量,c#,arrays,constants,C#,Arrays,Constants,我只想通过不仅指定值,而且指定它们将附加到的索引来初始化string[]数组常量 例如,关于: 私有静态只读字符串[]宠物=新字符串[]{“斗牛犬”、“灰狗”} 我想声明,斗牛犬对应于索引29,灰狗对应于索引5(比如php:) 有什么建议吗 干杯,如果您在数据结构方面有一定的灵活性,那么使用字典而不是数组来执行此行为会更有效 示例(如果您使用的是C#3或更高版本): var-pets=新字典{ {29,“斗牛犬”}, {5,“灰狗”} }; Console.WriteLine(宠物[5]);

我只想通过不仅指定值,而且指定它们将附加到的索引来初始化string[]数组常量

例如,关于:

私有静态只读字符串[]宠物=新字符串[]{“斗牛犬”、“灰狗”}

我想声明,斗牛犬对应于索引29,灰狗对应于索引5(比如php:)

有什么建议吗


干杯,

如果您在数据结构方面有一定的灵活性,那么使用
字典而不是数组来执行此行为会更有效

示例(如果您使用的是C#3或更高版本):

var-pets=新字典{
{29,“斗牛犬”},
{5,“灰狗”}
};
Console.WriteLine(宠物[5]);
遗留应用程序的相同示例:

Dictionary<int, string> pets = new Dictionary<int, string>();
pets[29] = "Bulldog";
pets[5] = "Greyhound";
Console.WriteLine(pets[5]);
Dictionary=newdictionary();
宠物[29]=“斗牛犬”;
宠物[5]=“灰狗”;
Console.WriteLine(宠物[5]);

您不需要字符串数组,而是需要一个
字典

看一看,这里有一个很好的例子(我在这里改编):

Dictionary d=newdictionary();
d、 添加(2,“类别”);
d、 添加(1,“狗”);
d、 添加(0,“骆驼”);
d、 加上(-1,“鬣蜥”);

听起来您不想要数组,而是想要一个
字典,可以这样初始化:

private static readonly Dictionary<int, string> pets = 
    new Dictionary<int, string> {
    { 29, "Bulldog" },
    { 5, "Greyhound" }
};
string[] myArray = CreateArray(new Tuple<int, string>(34, "cat"), new Tuple<int, string>(12, "dog"));

我认为在C#中声明数组时不可能实现所需的功能

除了像其他人建议的那样使用
字典
之外,您还可以尝试使用枚举,使用对应于字符串值的特定数组索引和描述(使用
描述
属性)的值

private enum Pets
{
   [Description("GreyHound")]
   Greyhound = 5,
   [Description("Bulldog")]
   Bulldog = 29
}

不能在初始值设定项中执行此操作,需要首先指定数组的大小,然后在特定位置添加项

private static readonly string[] Pets = new string[42];
然后在静态构造函数中插入项

private static MyClass
{
    Pets[29] = "Bulldog";
    Pets[5] = "Greyhound";
}

但正如其他人所建议的那样:使用
字典作为记录,我同意大家的看法,字典可能更合适。但是你可以写一个小方法来实现你想要的:

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;
}
publicstatict[]CreateArray(参数元组[]值)
{
var sortedValues=values.OrderBy(t=>t.Item1);
T[]数组=新的T[sortedValues.Last().Item1+1];
foreach(分类值中的var值)
{
数组[value.Item1]=value.Item2;
}
返回数组;
}
这样称呼它:

private static readonly Dictionary<int, string> pets = 
    new Dictionary<int, string> {
    { 29, "Bulldog" },
    { 5, "Greyhound" }
};
string[] myArray = CreateArray(new Tuple<int, string>(34, "cat"), new Tuple<int, string>(12, "dog"));
string[]myArray=CreateArray(新元组(34,“猫”),新元组(12,“狗”);
如果C#接收到许多人似乎想要的
Tuple
的语法糖,那么这看起来会更干净一些


这是个好主意吗?几乎可以肯定不是,但我会让OP来判断。

其他答案使用起来更直观,
int
是键,
string
是值。此答案假设您知道值而不是所需的“索引”位置。+1-这是唯一一个在同一行中显示创建和初始化的答案,尽管其他答案通常是正确的。你像往常一样打败了我乔恩;)由于我同意你的意见,我将答案改为使用初始值设定项。此外,还有一个小的输入错误(:而不是;)不太迂腐,但是可以使用数组初始值设定项将null赋值给除第5和第29个元素以外的所有元素。不过,如果我在野外看到这一点,我可能会开枪打死肇事者:-)谢谢本,我终于实现了你的解决方案。我也使用了System.Collections.Generic.KeyValuePair。
string[] myArray = CreateArray(new Tuple<int, string>(34, "cat"), new Tuple<int, string>(12, "dog"));