检查元素索引是不是在二维数组内(用于在任何方向移动一)
Posted
技术标签:
【中文标题】检查元素索引是不是在二维数组内(用于在任何方向移动一)【英文标题】:check if element indexes are inside 2d array (for moving by one in any direction)检查元素索引是否在二维数组内(用于在任何方向移动一) 【发布时间】:2018-01-23 08:05:00 【问题描述】:我有这个二维对象数组
private Cell[,] mapCells = new Cell[10, 10];
我想检查我的数组中是否存在坐标为 x = m 和 y = n 的键值对。
我去这个
bool cellExists = index.x >= 0 && // check left
index.y >= 0 && // check bottom
index.x < mapCells.GetLength(0) && // check right
index.y < mapCells.GetLength(1); // check top
因此,我使用这个 bool 检查单元格是在地图上还是在地图外。
有没有更优雅的方法来检查这个?
编辑:
当检查这个时,我得到一个运动方向,比如
Vector2 dir = new Vector2(/* this can be
(0,1) // up
(0,-1) // down
(-1,0) // left
(1,0) // right
*/);
所以我知道给出了哪个方向。
当我向右移动时,我认为不需要检查左侧。
【问题讨论】:
我觉得,已经够好了 你如何定义更优雅?它相当基于意见,不是吗? @HimBromBeere:我认为他的意思是更短或更快。我认为这两个方向的可能性都不大。 我编辑了我的问题,也许新信息会有所帮助 我投票结束这个问题,因为它是一个要求改进工作代码的评论,因此应该去codereview.stackexchange.com。 【参考方案1】:嗯,你可以把它隐藏在扩展方法后面,让它看起来更优雅。
public static class Extensions
public static bool IsExist(this Cell[,] mapCells, Cell index)
bool cellExists = index.x >= 0 &&
index.y >= 0 &&
index.x < mapCells.GetLength(0) &&
index.y < mapCells.GetLength(1);
return cellExists;
这样称呼
mapCells.IsExist(index);
【讨论】:
【参考方案2】:不,没有其他方法可以对此进行测试。我能想到的唯一优化是缓存大小,但在那里你并没有获得太多。
【讨论】:
我编辑了我的问题,也许新信息会有所帮助【参考方案3】:取决于您所说的“优雅”。你可以这样做(在我的脑海中):
bool cellExists = Math.Min(mapCells.GetLength(0) - 1, Math.Abs(x)) == x
&& Math.Min(mapCells.GetLength(1) - 1, Math.Abs(y)) == y
这个想法是首先得到 x 或 y 的绝对值,然后检查它的最小值和轴上值是否导致 x 或 y。如果是,那你很好。
它更短,但可读性值得怀疑。而且我怀疑它是否比您原来的解决方案更快。
【讨论】:
以上是关于检查元素索引是不是在二维数组内(用于在任何方向移动一)的主要内容,如果未能解决你的问题,请参考以下文章