2010-11-22 9 views
2

たとえば、可変長の整数配列の配列。 n == 3が、結果は整数の配列への3つのポインタの配列となり、このように表示されるならば、この場合、C#.NETで非固定マルチデメション配列を実装する最善の方法は何ですか?

int * * TwoDimAry = new int * [n] ; 

for (int i (0) ; i < n ; i ++) 
{ 
    TwoDimAry[i] = new int [i + n] ; 
} 

C++で

、我々は次のようなことをやってするために使用されている

もちろん

http://img263.imageshack.us/img263/4149/multidimarray.png

、.NETアレイは、コレクションを管理しているので、あなたは手動割り当て/削除に対処する必要はありません。

しかし宣言する:

int[][] TwoDimAry ; 

を... C#では、同じ効果を持っているように見えていない - つまり、あなたが同時にサブアレイのすべてをinnitializeしなければならない、と彼らはする必要が同じ長さ

私のサブ配列はネイティブのC++であるため、それぞれのサブ配列が独立している必要があります。

管理コレクションを使用してこれを実装する最善の方法は何ですか?私が知っておくべき欠点はありますか?

+2

ジグザグ配列( 'int [] []'構文)を宣言すると、サブ配列のサイズが異なることがあります。多次元配列( 'int [、]'構文)を宣言すると、サブ配列の長さは同じになります。 –

答えて

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、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>[]のハイブリッドアピールも機能します。

1

.Netでは、ほとんどの場合、この方法で配列を使用することはほとんどありません。これは.Netでは、配列はコレクションとは異なる動物として考えられるからです。マネージド、はい。コレクション?まあ、多分、それは何か特別なことを意味するので、用語を混同します。コレクションが必要な場合(ヒント:ほとんどの場合)、Systems.Collections.GenericなどのSystems.Collections名前空間を調べます。 List<List<int>>またはList<int[]>のいずれかが本当に必要なようです。

+0

私の知る限り、.Net配列は挿入/削除、並べ替え、検索、サイズ変更などの柔軟性を犠牲にしながら、より構造化された情報と高速なインデックス作成に向いています。私は、これが正確に私がこのプロジェクトに必要なものだと信じています。永続的な構造を持つ、より静的なデータセットです。 – Giffyguy

+0

@Giffy一般的なリストは、インデックスされたアクセスの配列とほぼ同じパフォーマンスプロファイルを持っています。私は_least_リストのために行くだろう。 –

関連する問題