我有一个包含特定顺序数据的数组。我经常对索引进行硬编码,以免过于混乱:
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初始化两行(实际上看起来不太好)。
干净,简单的方法是什么?
答案 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]