有没有可能得到“坐标”?元素的索引

本文关键字:元素 索引 坐标 有可能 | 更新日期: 2023-09-27 17:50:14

我有一个字符串[5,5]数组。是否有可能计算一个元素的位置基于它的索引,假设这将始终是一个5x5矩阵?

这里的位置是指元素在给定数组中的笛卡尔坐标

有没有可能得到“坐标”?元素的索引

也许一个简单的扩展方法会有所帮助:

public static class Extensions
{
    public static void FindCoordinates<T>(this T[,] source, int index, out int x,out int y)
    {
        int counter = 0;
        for (int i = 0; i < source.GetLength(0); i++)
        {
            for (int j = 0; j < source.GetLength(1); j++)
            {
                counter++;
                if (counter == index)
                {
                    x = i;
                    y = j;
                    return;
                }
            }
        }
        x = -1;
        y = -1;
    }
}

用法:

int[,] array = new int[5,5];
int x, y;
array.FindCoordinates(5,out x,out y);
Console.WriteLine("x = {0} y = {1}", x, y);  // x = 0 y = 4
array.FindCoordinates(7,out x,out y);
Console.WriteLine("x = {0} y = {1}", x, y); // x = 1 y = 1

简短回答- Yes

详细答案-单维数组和锯齿数组元素可以根据它们的索引从运行时数组类型实例的内存位置直接访问或修改。为此,CLR提供了一个名为ldelem和stelem的特殊IL指令,它根据数组元素的索引和堆栈上可用的数组对象引用来检索和修改数组元素。而使用对数组类型的合成运行时类型的方法调用来访问或修改多维数组元素。这使得锯齿数组比多维数组快得多,并且在需要多维的情况下推荐使用数组的方式。锯齿数组是CLS兼容的,但被错误地记录为不符合CLS。这一事实在MSDN2中得到了承认。"

复制自http://www.codeproject.com/KB/cs/net_type_internals.aspx?fid=459323&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2567811