Eri*_*sch 4 c# collections data-structures
我有多么相当于一个多维数组.
int[][][] MyValues;
Run Code Online (Sandbox Code Playgroud)
我想要的是通过强类型的equivelent访问索引,例如枚举.我知道你可以从Enum类型中获取枚举值,但是我的口味有点长.
我宁愿有办法强力键入索引.
例如:
int CarNumber = MyValues[Racetrack.Daytona][Race.Daytona500][Driver.JGordon];
Run Code Online (Sandbox Code Playgroud)
由于它是枚举式的,因此可以防止任何超出范围的异常被抛出,而且它为所有索引提供了一个很好的人类可读意义.
我已经使用字典方法实现了这一点,但它似乎有点沉重:
Dictionary<Racetrack,Dictionary<Race,<Dictionary<Driver,int>>> =
new Dictionary<Racetrack,Dictionary<Race,<Dictionary<Driver,int>>>();
Run Code Online (Sandbox Code Playgroud)
然后我可以通过枚举访问,但我真的不喜欢这种方法.这看起来很"难看".
我正在寻找一些替代方法,在使用人类可读的索引器时表示基本上是多维数组,同时保持类型安全(例如,不能无意中使用Race作为Race,所以简单地使用consts不是好方法).
有什么建议?
这将是一个编译时数组(上面的例子不是真实的,只是一个例子)所以我不必担心插入或删除或其他操作的数组.它将在价值,大小和布局方面保持不变.
使用带有const值的静态类也不是一个好方法,因为它不强制只有定义的值集可以作为索引器传递.
听起来你想要使用索引器而不是数组.假设以下枚举(基于公式1!):
public enum Track
{
Spielberg,
Adelaide,
Casablanca,
Liverpool,
Melbourne,
Berlin,
Sakhir,
}
public enum Constructor
{
BMW,
Ferrari,
McLaren,
Toyota,
Williams
}
public enum Driver
{
Hamilton,
Kovalainen,
Raikkonen,
Nakajima,
Glock
}
Run Code Online (Sandbox Code Playgroud)
基本结构如下:
public class Race
{
int Year { get; set; }
Track Track { get; set; }
Driver[] Placings { get; set; }
public int this[Driver driver] { } // placing by driver
}
public class Results
{
YearResults this[int index] { }
DriverResults this[Driver index] { }
TrackResults this[Track index] { }
ConstructorResults this[Constructor index] { }
}
public class YearResults
{
YearDriverResults this[Driver index] { }
}
Run Code Online (Sandbox Code Playgroud)
这当然是部分实现,但你可以通过这种方式对索引器做一些非常酷的事情.就像您可以使用任何顺序的任意值组合访问您的信息(假设您设置了所有中间类).
它比一个多维数组或一个元组键控词典更啰嗦,但我认为它会给你更优雅的代码.