例如:一组不同长度的整数数组。
在C ++中,我们习惯于这样做:
int * * TwoDimAry = new int * [n] ;
for ( int i ( 0 ) ; i < n ; i ++ )
{
TwoDimAry[i] = new int [i + n] ;
}
在这种情况下,如果是n == 3
,那么结果将是一个包含三个整数数组指针的数组,并且会显示如下:
http://img263.imageshack.us/img263/4149/multidimarray.png
当然,.NET数组是托管集合,因此您不必处理手动分配/删除。
但是声明:
int[][] TwoDimAry ;
...在C#中似乎没有相同的效果 - 即,你必须同时保留所有子数组,并且它们必须是相同的长度。
我需要我的子数组彼此独立,因为它们是原生C ++。
使用托管集合实现此目的的最佳方法是什么?我应该注意哪些缺点?
答案 0 :(得分:7)
与C ++一样,您需要初始化int[][]
中的每个子数组。
但是,它们不需要具有相同的长度。 (这就是为什么它被称为锯齿状的数组)
例如:
int[][] jagged1 = new int[][] { new int[1], new int[2], new int[3] };
您的C ++代码可以直接转换为C#:
int[][] TwoDimAry = new int[n][];
for(int i = 0; i < n; i++) {
TwoDimAry[i] = new int[i + n];
}
答案 1 :(得分:1)
这是一个用每行初始化为1,2,3,...元素的锯齿状数组的例子
int N = 20;
int[][] array = new int[N][]; // First index is rows, second is columns
for(int i=0; i < N; i++)
{
array[i] = new int[i+1]; // Initialize i-th row with 'i' columns
for( int j = 0; j <= i; j++)
{
array[i][j] = N*j+i; // Set a value for each column in the row
}
}
我已经足够使用它了解整体上没有太多缺点。使用List<int[]>
或List<int>[]
的混合应用也可以。
答案 2 :(得分:1)
在.Net中,大多数时候你根本不想以这种方式使用数组。这是因为在.Net中,数组被认为是与集合不同的动物。管理,是的。采集?好吧,也许,但它会混淆术语,因为这意味着特别的东西。如果你想要一个集合(提示:你大部分时间都这样做),请查看Systems.Collections命名空间,特别是Systems.Collections.Generic。听起来你真的想要List<List<int>>
或List<int[]>
。