我有一个N维数组,我希望能够为其分配任何原始值。 (一种类型适用于单个数组,但alg必须适用于所有基本类型。)
我写了一种可以做到这一点的方法:
var element = Array.CreateInstance(dataType, dataDims);
foreach (var index in GetIndexes(dataDims))
{
element.SetValue(SomeKindOfValue, index);
}
函数GetIndexes生成给定尺寸的所有可能的索引:
public static IEnumerable<int[]> GetIndexes(int[] dims)
{
int lastIndex = dims.Length - 1;
int lastDim = dims[lastIndex];
int[] Index = new int[dims.Length];
int currentDim = lastIndex;
while (currentDim >= 0)
{
if (currentDim == lastIndex)
{
for (int i = 0; i < lastDim; i++)
{
yield return Index;
Index[currentDim]++;
}
Index[currentDim] = 0;
currentDim--;
continue;
}
else
{
if (Index[currentDim] == dims[currentDim] - 1)
{
Index[currentDim] = 0;
currentDim--;
continue;
}
else
{
Index[currentDim]++;
currentDim = lastIndex;
continue;
}
}
}
}
示例:对于GetIndexes(new int [] {4,2,3}),输出将为:
0, 0, 0 |
0, 0, 1 |
0, 0, 2 |
0, 1, 0 |
0, 1, 1 |
0, 1, 2 |
1, 0, 0 |
1, 0, 1 |
1, 0, 2 |
1, 1, 0 |
1, 1, 1 |
1, 1, 2 |
2, 0, 0 |
2, 0, 1 |
2, 0, 2 |
2, 1, 0 |
2, 1, 1 |
2, 1, 2 |
3, 0, 0 |
3, 0, 1 |
3, 0, 2 |
3, 1, 0 |
3, 1, 1 |
3, 1, 2 |
问题在于,以这种方式分配值非常耗时,并且这种算法需要尽可能高效。
我当时以为多维数组实际上是内存中的1d数组,所以如果我可以访问每个元素的指针,那么我可以直接为无计算的值赋值。问题是我无法找到一种方法来创建指向通用类Array(或它的第一个元素)的指针。
基本上,我正在尝试为此编写一个泛型函数(它将接受任何原始类型作为数组的数据类型,并将接受任何多维数组):
public static unsafe void SetElementsByPointer(int[,] array, int[] values)
{
if (values.Length != array.LongLength)
throw new Exception("array and values length mismatch.");
fixed (int* pStart = array)
{
for (int i = 0; i < array.LongLength; i++)
{
int* pElement = pStart + i;
*pElement = values[i];
}
}
}
对于将值设置为n维数组的任何其他想法,我将不胜感激,但是指针方式似乎是最有效的,只是我无法弄清楚
谢谢。
答案 0 :(得分:0)
要复制内容,您可以使用以下命令:https://dotnetfiddle.net/vTzJv4
// 1D array
int[] values = new int[] {
1, 2, 3,
4, 5, 6
};
// 2D array
int[,] marr = new int[2,3];
// Copy here
System.Buffer.BlockCopy((Array)values, 0, (Array)marr, 0, (int)marr.LongLength * sizeof(int));