在C#.NET中实现未修复的多维数组的最佳方法是什么?

时间:2010-11-22 03:35:09

标签: c# .net arrays multidimensional-array

例如:一组不同长度的整数数组。

在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 ++。

使用托管集合实现此目的的最佳方法是什么?我应该注意哪些缺点?

3 个答案:

答案 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[]>