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);