代码之家  ›  专栏  ›  技术社区  ›  Giffyguy

在C.NET中实现非固定多分区阵列的最佳方法是什么?

  •  2
  • Giffyguy  · 技术社区  · 13 年前

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

    在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 回复  |  直到 13 年前
        1
  •  7
  •   SLaks    13 年前

    像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];
    }
    
        2
  •  1
  •   John Alexiou    13 年前

    下面是一个使用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>[] 也可以。

        3
  •  1
  •   Joel Coehoorn    13 年前

    在.NET中,大多数情况下您根本不想这样使用数组。这是因为在.NET中,数组被认为是与集合不同的动物。管理,是的。收藏?嗯,也许吧,但是它混淆了术语,因为这意味着一些特殊的东西。如果您想要一个集合(提示:大多数情况下都是这样),请查看Systems.Collections命名空间,尤其是Systems.Collections.Generic。听起来你真的想要 List<List<int>> 或A List<int[]> .