C# 四个无限方向的二维阵列

C# 四个无限方向的二维阵列,c#,arrays,C#,Arrays,我想创建一个二维瓷砖贴图。例如: Cell[,] cells; for(int x = 0; x < columns; x++) { for(int y = 0; y < rows; y++) { cells[x, y] = new Cell(); } } 单元[,]单元; 对于(int x=0;x

我想创建一个二维瓷砖贴图。例如:

Cell[,] cells;

for(int x = 0; x < columns; x++)
{
    for(int y = 0; y < rows; y++)
    {
        cells[x, y] = new Cell();
    }
}
单元[,]单元;
对于(int x=0;x
第一个单元格将位于(0 | 0)。如果我想以这个单元格为中心,在左侧和顶部创建新的单元格,该怎么办?这些细胞会有负指数

解决此问题的一种方法是确定一个方向的最大长度的值。如果地图每边有100块瓷砖,则地图的中心位置为(50 | 50)


假设没有硬件限制,也没有每边的最大长度,那么创建具有(0 | 0)中心的2D地图的最佳方法是什么?在2D数组中,我无法想象比通过单元格的x和y坐标访问单元格更好的方法。

嗯,数组是逻辑结构,而不是物理结构。
这意味着我们将
0,0
视为
左上角
,虽然可能有助于可视化二维数组的内容(事实上,二维数组在某种程度上也是一种可视化辅助工具),但根本不准确-
0,0
“单元格”不是角,索引不是坐标,尽管当你像他们一样思考他们时,理解他们真的很有帮助

也就是说,没有什么能阻止您创建自己的类,它实现了一个可以接受正值和负值的索引器-事实上,根据

索引器不必按整数值编制索引;如何定义特定的查找机制取决于您

因为您甚至没有义务使用整数,所以您可以使用正值和负值作为索引器


我正在测试一个想法,即使用列表列表进行存储,并根据类索引器动态计算存储索引,但现在已经太晚了,我想我已经太累了,无法正确地进行操作。这有点像另一个答案上的解决方案,但我尝试在不让您在构造函数中设置最终大小的情况下执行此操作。

好吧,您不能在数组或列表中使用负索引,它们不是解决此类问题的正确结构。。。但是,您可以编写自己的类来处理类似的事情

只需将网格的大小传递给构造函数,然后使用index操作符返回一个基于调整后的索引的值。。。像这样的。。。写得很快,所以在优化方面可能并不理想

public class Grid<T> {
        T[,] grid { get; }

        int adjustment { get; }

        int FindIndex(int provided) {
            return provided + adjustment;
        }

        public Grid(int dimension) {
            if (dimension <= 0)
                throw new ArgumentException("Grid dimension cannot be <= 0");
            if (dimension % 2 != 0)
                throw new ArgumentException("Grid must be evenly divisible");
            adjustment = dimension / 2;
            grid = new T[dimension, dimension];
        }

        public T this[int key, int key2] {
            get {
                return grid[FindIndex(key), FindIndex(key2)];
            }
            set {
                grid[FindIndex(key), FindIndex(key2)] = value;
            }
        }
    }
公共类网格{
T[,]网格{get;}
整数调整{get;}
int FindIndex(提供int){
提供退货+调整;
}
公共网格(整数维){

如果(维)“这些单元格将有负索引”?这不是数组在C#中的工作方式。你要么不需要使用数组,要么将你的中心重新定义为正值并使用偏移量(可以是负值)而不是索引。哪一个更好?要知道我们必须知道你是如何衡量“更好”的,您还没有告诉我们。您应该有一个具有四个属性的类单元格:单元格左;单元格顶;单元格右;单元格底。您可以通过转到相邻的单元格始终枚举单元格。单元格类还将具有行和列编号。现在为了更容易访问单元格,您可以使用静态列表映射,该映射将t除中行和中列外,大多数单元格为空。您是仅通过索引(x,y坐标)访问这些对象,还是希望通过其他方式引用它们?
        var grid = new Grid<int>(100);
        grid[-50, -50] = 5;
        grid[0, 1] = 10;
        var grid = new Grid<Cell>(100);