高效访问c#中的大量对象

时间:2014-02-06 22:29:14

标签: c# xna

使用C#XNA使用六边形网格制作游戏。地图大小可以是从每边6个单元到144的任何位置。使用一些几何数学,这意味着最大单元数为61,777! (我也在考虑每边最多216个细胞,总共产生139,537个细胞!)

我需要的是一种基于网格坐标访问给定单元格的有效方法。遍历整个列表,直到找到col == c和row == r的地方为止削减它。

数据结构也需要调整大小(因为击败一个级别意味着你去下一个地图,可能更大或更小)。所以我不能使用2D数组(如果我错了,请纠正我)。现在我正在考虑List,因为它确实有一个ElementAt<i>。但是List<List<CELL>>似乎很麻烦。 CELL的动态2D数组似乎是最好的,但除非我严重错误,否则这些数组需要在C#中固定大小。

请让我知道任何可能性的内部运作。列表如何存储他们的数据? (除了拿着指针---我需要知道任何其他开销)。它们是真正的随机访问还是ElementAt<i>实际上迭代了一次以获得该元素?

我所拥有的其他激进思想就像二进制树,除了base-6之外,就像将地图分成六边形扇区一样,每个扇区都包含一堆单元格。然而,有了这些激进的想法,我无法理解任何实现细节:(

2 个答案:

答案 0 :(得分:2)

您可以使用嵌套的List<List<T>>。正如其他人所提到的,基于MSDN

  

检索此属性的值是O(1)操作;设置   该属性也是O(1)操作。

我建议您编写如下所示的界面,然后在您决定稍后更改实施时实施它。

public interface IGrid<T>
{
    T Get(int x, int y);
    void Set(int x, int y, T value);
    void Insert(int x, int y, T value);
    void Remove(int x, int y);
}

public class Grid<T>: IGrid<T>
{
    private List<List<T>> _data = new List<List<T>>();

    public T Get(int x, int y)
    {
        return _data[x][y];
    }

    public void Set(int x, int y, T value)
    {
        _data[x][y] = value;
    }

    public void Insert(int x, int y, T value)
    {
        throw new NotImplementedException();
    }

    public void Remove(int x, int y)
    {
        throw new NotImplementedException();
    }
}

然后你可以这样写:

        var myGrid = new Grid<Cell>();
        myGrid.Set(0, 0, new Cell("Blah"));

答案 1 :(得分:0)

我会使用词典

文件:http://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx
用法:http://www.dotnetperls.com/dictionary

您可以使用您创建的对象(如Point对象)或类似字符串对其进行索引:

string key = r+","+c;

我会选择键作为字符串,因为它会更容易提高速度,使得点数不会太多。

考虑使用这样的字符串键来执行此操作:

dictionary Dictionary<string,Cell> = new Dictionary<string,cell>();

然后,您可以创建一个方法来创建密钥,以确保您始终获得正确的密钥

public string createKey(int row,int col)
{
return r+","+c;
}

public string createKey(Cell cell)
{
return createKey(cell.row,cell.col);
}

检索单元格时,您可以执行此类调用

int c=0;
int r=0;
Cell cell = dictionary[createKey(r,c)].doSomethingWithCell();

希望这有帮助