这是一个好奇的问题。我已经有一个现有的解决方案,但我想知道是否有更好的方法。
我的呼叫者想要使用int [][ ]来调用我。我有一个需要处理int **的例程。如何进行此转换?换句话说:
public static void Func1(int[][] data) {
Func2(data); //how to do this?
}
private unsafe static void Func2(int** data) {
//process data
}
以下是我能想到的最佳方法。它运行良好,但我不能说我对递归方式(和O(data.Length)堆栈空间的需求)感到100%满意。
public static void Main() {
var test=new[] {
new [] {10},
new [] {20,30},
new [] {40,50,60},
new [] {70,80,90,100},
};
MySolution_Func1(test);
}
public unsafe static void MySolution_Func1(int[][] data) {
var items=new int*[data.Length];
Recurse(0, data, items);
}
public unsafe static void Recurse(int index, int[][] data, int*[] build) {
if(index==data.Length) {
fixed(int** finalp=build) {
Func2(finalp);
}
} else {
fixed(int* nextp=data[index]) {
build[index]=nextp;
Recurse(index+1, data, build);
}
}
}
private unsafe static void Func2(int** data) {
for(var j=0; j<4; ++j) {
for(var i=0; i<j+1; ++i) {
Debug.WriteLine("{0},{1}: {2}", j, i, data[j][i]);
}
}
}
int[][]
数组需要对每一行进行某种形式的迭代...最好在首次接受int**
的函数中完成这个操作--也就是说,不要调整数据,而是调整使用方式。对于“一次性”情况更加实用。此外,考虑使用int[,]
并将其固定到具有“虚拟索引”的int*
上。祝编码愉快。 - user166390