在适当的位置重塑c#数组

时间:2018-07-18 11:50:16

标签: c# arrays

对数组可能有一些不依赖于数组等级的操作。迭代器也不总是合适的解决方案。给定数组

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

希望实现以下工作流程:

  1. 将Rank> 1的数组重整为rank = 1且元素数量相同的线性数组。这应该发生在适当位置,以提高运行时效率。不允许复制。
  2. 将经过整形的数组传递给仅针对Rank = 1数组定义的方法。例如Array.copy()
  3. 将结果数组重塑为原始等级和尺寸。

对此主题有一个类似的问题:How to reshape array in c#。那里的解决方案通过BlockCopy()使用内存复制操作。

我的问题是: 没有内存复制就可以实现这种重塑吗?还是以临时方式(例如在数据上创建新视图)?

1 个答案:

答案 0 :(得分:3)

对此的措辞有点难,但肯定可以使用指针unsafefixed。无记忆复制,直接访问,加胡椒粉和盐调味

CLR 不会让您随意转换数组,您可以想到的任何其他方法都需要分配一个新数组并进行复制(请注意,您可以迅速减轻负担)。唯一的其他可能方法是使用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