阵列访问的硬编码索引

时间:2014-04-28 23:34:33

标签: 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;
     ...
     internal const DATA_LENGHT     = XX;
}

但这种方式很难维持。如果我想在索引0处插入新数据,我需要手动更改所有后续的INDEX_XXX。

我想使用某种初始化程序,但下面不起作用:

     internal const INDEX_NAME      = i++;
     internal const INDEX_FIRSTNAME = i++;
     internal const INDEX_CITY      = i++;

我也可以将const更改为readonly并在静态构造函数中初始化它,但这意味着每个INDEX初始化两行(实际上看起来不太好)。

干净,简单的方法是什么?

4 个答案:

答案 0 :(得分:2)

最佳答案可能是使用enum建议的Blorgbeard

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;

答案 1 :(得分:1)

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

private Dictionary<string,string> _indexDictionary;

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

然后你只需将索引值从字典中拉出来:

var blah = data[_indexDictionary["INDEX_NAME"]]

可读性权衡是有争议的,并且比枚举更多开销,但有效......

答案 2 :(得分:0)

尝试使用枚举:

public enum MyIndexes
{
INDEX_NAME = 0,
INDEX_FIRSTNAME,
INDEX_FIRSTNAME
}

您可以为每个条目声明一个值,或者声明第一个条目是您想要的。如果你这样做,一切都增加一个。如果要将其用作数组中的索引,可以使用以下命令:

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

答案 3 :(得分:0)

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

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

然后

data[(int)Indices.INDEX_NAME]