最优雅的方法是按位置获取数组元素?

Ang*_*ker 0 .net c# arrays

我有一个数组:

private int[,] _blocks = new int[6, 4];
Run Code Online (Sandbox Code Playgroud)

它代表一组水平深6深,垂直深4深的块.图形上它看起来像这样:

替代文字http://www.angryhacker.com/toys/array.png

我需要一个函数,它将接受一个数字,从1到24并返回匹配的数组元素.所以对于14号,我会回到_blocks [1,2];

我创建了一个简单的函数:

private int GetBlockByPosition(int position)
{
    int count = 0;
    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (++count == position)
                return _blocks[i, j];
        }
    }
    return -1;
}    
Run Code Online (Sandbox Code Playgroud)

但这看起来很浪费,闻起来很糟糕.有更优雅和更快的方式吗?

Mic*_*ens 10

无论是水平方向还是垂直方向,您都可以在数字表中看到一个模式.您可以position / 6使用position % 6- 模运算确定水平位置和垂直位置.

private int GetBlockByPosition(int position)
{
    return _blocks[((position + 6) / 6) - 1, position % 6];
}
Run Code Online (Sandbox Code Playgroud)

这有数学意义.分块增加,模数(除法余数)逐一增加.数学很简单.


Mik*_*scu 6

我不确定我会跟进,但为什么你不能根据位置计算他的指数?像这样的东西:

return _blocks[((position - 1) % 6),((position + 5) / 6) - 1];
Run Code Online (Sandbox Code Playgroud)