Каков наилучший способ реализации нефиксированного многодеминсионного массива в C # .NET? - PullRequest
2 голосов
/ 22 ноября 2010

Например: массив целочисленных массивов переменной длины.

В 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 ]

7 голосов
/ 22 ноября 2010

Как и в 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 голос
/ 22 ноября 2010

В .Net большую часть времени вы вообще не хотите использовать массивы. Это связано с тем, что в .Net массивы считаются разными животными из коллекции. Удалось, да. Коллекция? Ну, может быть, но это сбивает с толку термины, потому что это означает что-то особенное. Если вам нужна коллекция (подсказка: большую часть времени вы это делаете), посмотрите в пространство имен Systems.Collections, в частности Systems.Collections.Generic. Похоже, вы действительно хотите либо List<List<int>>, либо List<int[]>.

1 голос
/ 22 ноября 2010

Вот пример с зубчатым массивом, инициализированным 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>[] также работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...