代码之家  ›  专栏  ›  技术社区  ›  Georg W. RRUZ

在适当的位置重塑c#阵列

  •  1
  • Georg W. RRUZ  · 技术社区  · 6 年前

    数组上的may操作不依赖于数组的秩。迭代器也不总是一个合适的解决方案给定数组

    double[,] myarray = new double[10,5];
    

    希望实现以下工作流程:

    1. 将秩为1的数组重塑为秩为1且元素数相同的线性数组。这应该发生在运行时有效的地方。不允许复制。
    2. 将经过整形的数组传递给仅为rank=1数组定义的方法。例如array.copy()
    3. 将结果数组重塑为原始秩和维数。

    在这个问题上有一个类似的问题: How to reshape array in c# 是的。那里的解决方案使用BlockCopy()的内存复制操作。

    我的问题是: 没有内存拷贝就可以实现这种整形吗?或者是像在数据上创建一个新视图这样的临时方法?

    1 回复  |  直到 6 年前
        1
  •  3
  •   TheGeneral    6 年前

    这里的措辞有点强硬,但肯定有点言外之意 unsafe fixed 会有用的。无记忆拷贝,直接存取,加胡椒和盐调味

    这个 清除 只是不会让你像你想的那样投射一个数组,你能想到的任何其他方法都需要分配一个新的数组并复制(这意味着你可以很快变亮)。唯一可能的另一种方法是使用fixed,它将为您提供连续的一维数组。

    unsafe public static void SomeMethod(int* p, int size)
    {
       for (var i = 0; i < 4; i++)
       {
          //Perform any linear operation
          *(p + i) *= 10;
       }
    }
    ...
    
    var someArray = new int[2,2];
    someArray[0, 0] = 1;
    someArray[0,1] = 2;
    someArray[1, 0] = 3;
    someArray[1, 1] = 4;
    
    //Reshape an array to a linear array 
    fixed (int* p = someArray)
    {
         SomeMethod(p, 4);
    }
    
    //Reshape result array to original rank and dimensions.
    
    for (int i = 0; i < 2; i++)
    {
       for (int j = 0; j < 2; j++)
       {
          Console.WriteLine(someArray[i, j]);
       }
    }
    

    输出

    10
    20
    30
    40