检查元素索引是不是在二维数组内(用于在任何方向移动一)

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 = my = 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。如果是,那你很好。

它更短,但可读性值得怀疑。而且我怀疑它是否比您原来的解决方案更快。

【讨论】:

以上是关于检查元素索引是不是在二维数组内(用于在任何方向移动一)的主要内容,如果未能解决你的问题,请参考以下文章

检查二维数组c#中的某些元素是不是相等

检查在任何地方的检查应用程序中都提出问题

在Python中检查二维数组中的所有元素是不是等于1 [重复]

来点福利,看二维数组如何打造推箱子小游戏

我可以从二维列表中删除列表元素吗? [复制]

检查元素是不是属于集合的算法