具有负索引的数组



我有一个数组,我用它来存储我正在制作的游戏的地图数据。

MyMapType[,,] map; 

我使用固定数组而不是集合的原因是固定数组的工作速度非常快。

现在我的问题是,我希望在游戏中支持负z关卡。所以我希望能够访问一个负索引

如果这是不可能的,我想到了两个其他的解决方案。

我在想一个可能的解决方案,把地面高度作为一个任意的数字(比如10),任何小于10的都可以被认为是负的。但是如果它不被使用,这不会让数组变大10倍吗?

我考虑的另一个解决方案是"滚动我自己的",你有一个2D数组的字典,在列表中保存Z级作为索引。但是这需要更多的工作,我不确定它是否很慢。

所以总结一下——有什么方法可以创建一个支持负索引的数组吗?如果没有,是否有一种干净的方式来"模拟"这种行为,而不牺牲太多的CPU时间或RAM -注意这些游戏地图可能最终会很大,需要不断访问。

用类替换数组:

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];}
    }
}

它不会改变您需要为它们设置大小的事实。老实说,我更喜欢第一个

如果你想"negative"c# 8现在支持索引

var words = new string[]
{
                // index from start    index from end
    "The",      // 0                   ^9
    "quick",    // 1                   ^8
    "brown",    // 2                   ^7
    "fox",      // 3                   ^6
    "jumps",    // 4                   ^5
    "over",     // 5                   ^4
    "the",      // 6                   ^3
    "lazy",     // 7                   ^2
    "dog"       // 8                   ^1
};              // 9 (or words.Length) ^0

所以要调用负的就像这样

words[^1]

查看此链接

在这里中间的元素可以是0 Z

使用Dictionary类,因为您可以为键或值分配任何您想要的值。虽然我不确定这对于您上面展示的三维数组是如何工作的,但我可以展示如果这是一个一维数组是如何工作的,并且您可以推断如何最好地利用它:

MyMapType[] map;
//map is filled with w/e data
Dictionary<int, MyMapType> x = new Dictionary<int, MyMapType>();
x[-1] = //(map data for whatever value is for the negative value);
x[0] = map[0]
//(etc...)

是否可以尝试在两个列表中存储MyMapTime[,]列表:

  • 1表示z值大于或等于0
  • 和第二个负z值。

表的索引将是z的值。这样你就可以快速访问特定z水平的xy值。当然问题是,z值是多少?是稀疏的还是密集的?即使对于稀疏值,您最终也会得到一个数组,其中包含[,]的空值。

我想在这里指出,字典允许使用负索引2D字典也可以解决这些问题,想想数据结构,如果你能忍受字典

注意字典和列表在不同的场景中使用。它们的速度取决于在它们上面使用了什么函数

相关内容

  • 没有找到相关文章

最新更新