C# 在二维阵列中查找相邻单元的有效方法

C# 在二维阵列中查找相邻单元的有效方法,c#,arrays,multidimensional-array,coding-efficiency,C#,Arrays,Multidimensional Array,Coding Efficiency,我有一个2d类平铺数组。在创建运动场时,我必须生成所有直接相邻的单元(水平、垂直、对角)。我首先生成一个字段,用一个新的平铺填充每个单元格,然后(完成后)我通过2d数组循环,使用这段循环计算邻居: int dnDistance= 1; //Direct Neighbor Distance. for (int iMapY = 0; iMapY < playfieldHeight; iMapY++) { for (int iMapX = 0; iMapX < playfield

我有一个2d类平铺数组。在创建运动场时,我必须生成所有直接相邻的单元(水平、垂直、对角)。我首先生成一个字段,用一个新的平铺填充每个单元格,然后(完成后)我通过2d数组循环,使用这段循环计算邻居:

int dnDistance= 1; //Direct Neighbor Distance.

for (int iMapY = 0; iMapY < playfieldHeight; iMapY++)
{
    for (int iMapX = 0; iMapX < playfieldWidth; iMapX++)
    {
        for (int yOffset = -dnDistance; yOffset <= dnDistance; yOffset++)
        {
            for (int xOffset = -dnDistance; xOffset <= dnDistance; xOffset++)
            {
                if ((iMapX + xOffset >= 0 && iMapX + xOffset < playfieldWidth) && (iMapY + yOffset >= 0 && iMapY + yOffset < playfieldHeight))
                { 
                    if (!(yOffset == 0 && xOffset == 0))
                    { 
                            playfieldTiles[iMapX, iMapY].dnTiles.Add(playfieldTiles[iMapX + xOffset, iMapY + yOffset]);
                    }
                }
            }
        }
    }
}
int-dnDistance=1//直接相邻距离。
对于(int-iMapY=0;iMapY
使用这种方法,我必须第二次遍历整个2d数组,创建一个for循环、一个for循环、一个for循环、一个for循环,这有时是非常不清楚的。一定有更好的办法,对吧


我发现它看起来很相似,但不完全相同,或者我不太理解它:

当它正常工作时,就没事了

这里有一个小小的优化,使调试变得更容易:

var playfieldHeight = 5;
var playfieldWidth = 5;
var playfieldTiles = new byte[playfieldWidth + dnDistance * 2, playfieldHeight + dnDistance * 2];
var len1 = playfieldWidth * playfieldHeight;
var len2 = dnDistance * 2 + 1;

for (var i = 0; i < len1; i++)
{
    var ix = i % playfieldWidth;
    var iy = i / playfieldWidth;
    for (var j = 0; j < len2 * len2; j++)
    {
        var jx = j % len2 - dnDistance;
        var jy = j / len2 - dnDistance;
        Console.WriteLine($"x1: {ix}, y1: {iy}, x2: {jx}, y2: {jy}");
    }
}
var playfieldHeight=5;
var playfieldWidth=5;
var playfieldTiles=新字节[playfieldWidth+dnDistance*2,playfieldHeight+dnDistance*2];
var len1=操场宽度*操场高度;
var len2=dnDistance*2+1;
对于(变量i=0;i
现在只有两个循环,场和相邻循环


你可以用一个
for
来进一步优化它,但我相信可读性会降低(在循环内部)。

你正在实现你链接的帖子的相同想法,对我来说,这似乎是一种方法。一般来说,如果你最终有两个或三个以上的
for
嵌套循环,你就做错了什么,除非你使用的是4D阵列或其他东西@Aybe展示了如何在两个
for
循环中完成这项工作。我想我现在已经理解了这一点,因为我第二次看了它。使用第一个for循环和游戏场中的瓷砖总数(本例中为25),将两个for循环组合成一个大的for循环。ix和iy是iMapX和iMapY。对于2个循环,计算邻居也是一样的。如果我是对的,这不会以任何方式影响性能,但确实会使阅读变得更好。我将把它标记为一个答案(因为我不认为它在性能方面会变得更好),并对此进行研究。谢谢:)不客气,我只是喜欢用老方法绘制像素:在偏移量到X/Y之间转换。这也确实简化了调试,正如我说的,它可能是一个单循环,但边界会很奇怪,这里很简单,性能永远不会是个问题,除非你循环大量的项目。