C# 用于阵列访问的硬编码索引

C# 用于阵列访问的硬编码索引,c#,C#,我有一个数组,它包含特定顺序的数据。我通常对索引进行硬编码,以避免过于混乱: public class MyClass { private readonly string[] data = new string[DATA_LENGHT]; internal const INDEX_NAME = 00; internal const INDEX_FIRSTNAME = 01; internal const INDEX_CITY = 02

我有一个数组,它包含特定顺序的数据。我通常对索引进行硬编码,以避免过于混乱:

public class MyClass
{
     private readonly string[] data = new string[DATA_LENGHT];

     internal const INDEX_NAME      = 00;
     internal const INDEX_FIRSTNAME = 01;
     internal const INDEX_CITY      = 02;
     ...
     internal const DATA_LENGHT     = XX;
}
但这种方式很难维持。如果我想在索引0处插入一个新数据,我需要手动更改所有后续索引

我想使用某种初始值设定项,但以下选项不起作用:

     internal const INDEX_NAME      = i++;
     internal const INDEX_FIRSTNAME = i++;
     internal const INDEX_CITY      = i++;
我还可以将const更改为readonly并在静态构造函数中初始化它,但这意味着每个索引两行用于初始化(实际上看起来不太好)


什么是一种干净、简单的方法?

尝试使用枚举进行此操作:

public enum MyIndexes
{
INDEX_NAME = 0,
INDEX_FIRSTNAME,
INDEX_FIRSTNAME
}
可以为每个条目声明一个值,也可以根据需要声明第一个条目。如果你这样做的话,之后的一切都会增加1。如果要将其用作数组中的索引,可以使用以下方法:

(int)MyIndexes.INDEX_NAME // index 0
(int)MyIndexes.INDEX_FIRSTNAME // would be index 1

您的方法很奇怪,但您可以使用枚举替换常量,例如:

public enum Indices
{
   INDEX_NAME = 0,
   INDEX_FIRSTNAME,
   INDEX_CITY,
   ...
}
然后

data[(int)Indices.INDEX_NAME]

还可以使用字典保存索引值。这将使您回到每个索引一行,再加上Dictionary init的两行额外内容

private Dictionary<string,string> _indexDictionary;

public MyClass()
{
    _indexDictionary = new Dictionary<string,string>();
    _indexDictionary.Add("INDEX_NAME","00");
    _indexDictionary.Add("INDEX_FIRSTNAME","01");
    ...
}

可读性权衡是有争议的,并且比枚举的开销要大一些,但是有效…

最好的答案可能是像建议的那样使用
enum

enum Indices : int
{
    Name = 0,
    FirstName,
    City,
    //...
    Length
}
另一种解决方案是增加以前的值

internal const int INDEX_NAME       = 0;
internal const int INDEX_FIRSTNAME  = INDEX_NAME + 1;
internal const int INDEX_CITY       = INDEX_FIRSTNAME + 1;

有没有理由不在使用正常命名属性公开的正常字段中转换该数组?顺序实际上很重要,还是因为您使用的是数组而很重要?你可以只使用实际命名的字段吗?你可以使用
枚举索引:int{Name=0,FirstName,City,…
我正在读取剪贴板,并期望数据的特定顺序。我实际上是在之后将数组转换为普通字段,但首先我只有这个数组。如果不是完美的解决方案,那么让我们使用增量解决方案事件(没有重复检查,有点混乱)但不需要强制转换。枚举方式与重复检查相同,但我不喜欢使用它的语法…(个人首选项)
internal const int INDEX_NAME       = 0;
internal const int INDEX_FIRSTNAME  = INDEX_NAME + 1;
internal const int INDEX_CITY       = INDEX_FIRSTNAME + 1;