具有负索引的数组

时间:2013-03-31 14:18:47

标签: c# arrays multidimensional-array

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

MyMapType[,,] map; 

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

现在我的问题是,我想支持游戏中的负z级别。所以我希望能够访问负面索引。

如果无法做到这一点,我想到了其他一些解决方案。

我在考虑将地面级别作为一些任意数字(例如10)的可能解决方案,并且任何小于10的都可以被认为是否定的。但如果它没有被使用,这不会使数组大10倍吗?

我考虑的另一个解决方案是“滚动我自己的”,你有一个2D数组的字典,其中Z级保持在List中作为索引。但这是一项更多的工作,我不确定它是否缓慢。

总结一下 - 创建支持负索引的数组的任何方法?如果没有 - 是否有一种“模仿”这种行为的干净方式,而不会牺牲太多的CPU时间或RAM - 注意这些游戏地图可能会变得很大并且需要不断访问。

4 个答案:

答案 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值大于或等于0
  • 和负z值的第二个。

表的索引是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字典也可以解决这些问题,只需考虑数据结构以及是否可以使用字典

请注意,词典和列表用于不同的场景。 它们的速度取决于它们使用的功能