我有一个数组,我用它存储我正在处理的游戏的地图数据。
MyMapType[,,] map;
我使用固定数组而不是Collection的原因是因为固定数组的工作速度非常快。
现在我的问题是,我想支持游戏中的负z级别。所以我希望能够访问负面索引。
如果无法做到这一点,我想到了其他一些解决方案。
我在考虑将地面级别作为一些任意数字(例如10)的可能解决方案,并且任何小于10的都可以被认为是否定的。但如果它没有被使用,这不会使数组大10倍吗?
我考虑的另一个解决方案是“滚动我自己的”,你有一个2D数组的字典,其中Z级保持在List中作为索引。但这是一项更多的工作,我不确定它是否缓慢。
总结一下 - 创建支持负索引的数组的任何方法?如果没有 - 是否有一种“模仿”这种行为的干净方式,而不会牺牲太多的CPU时间或RAM - 注意这些游戏地图可能会变得很大并且需要不断访问。
答案 0 :(得分:8)
用类替换你的数组:
class MyArray {
private MyMapType[] myArray = new myMapType[size]
MyMapType this[index] {
get{return myArray[index + offset];}
}
}
您可以在构造函数中设置大小和偏移量,甚至可以随意更改它。
在此示例的基础上,这是另一个版本:
class MyArray {
private MyMapType[] positives = new myMapType[size]
private MyMapType[] negatives = new myMapType[size-1]
MyMapType this[index] {
get{return index >= 0 ? positives[index] : negateves[1-index];}
}
}
它不会改变您需要为它们设置大小的事实。老实说,我更喜欢第一个更好的
答案 1 :(得分:1)
您是否可以尝试将MyMapTime [,]列表存储在两个列表中:
表的索引是z的值。 通过此操作,您可以快速访问特定z级别的xy值。 当然问题是:你的z值是多少?是稀疏还是密集。 即使对于稀疏值,最终也会得到一个包含[,]。
空值的数组答案 2 :(得分:1)
如果您想要“负”索引,C#8现在支持它。
var words = new string[]
{
// index from start index from end
"The", // 0 ^9
"quick", // 1 ^8
"brown", // 2 ^7
"fox", // 3 ^6
"jumped", // 4 ^5
"over", // 5 ^4
"the", // 6 ^3
"lazy", // 7 ^2
"dog" // 8 ^1
}; // 9 (or words.Length) ^0
因此调用否定词将是这样
words[^1]
查看此link
所以在您的情况下,中间元素可能是零Z
答案 3 :(得分:-1)
我想在此注意字典允许使用否定索引 2D字典也可以解决这些问题,只需考虑数据结构以及是否可以使用字典
请注意,词典和列表用于不同的场景。 它们的速度取决于它们使用的功能