2011-09-11 5 views
0

私は、次の方法でアクセスして設定することができます多次元リストを作成しようとしています:この多次元リストの挿入を実行しようとすると、何が失われますか?

myObjectVar[1,2,3] = new MyObject(); 

私は次のように[,,]をオーバーロードしているが、挿入が実行を取得することはありません。以下のコードが機能していないため、インデックスが存在するかどうかを確認する正しい方法は何ですか?

public myObject this[int x, int y, int z] { 
    get { 
    return _myObject[x][y][z]; 
} 

    set { 
     if(_myObject.Count < x){ 
      _myObject.Insert(x, new List<List<myObject>>()); 
     } 

     if(_myObject[x].Count < y){ 
      _myObject[x].Insert(y, new List<myObject>()); 
     } 

     if(_myObject[x][y].Count < z){ 
      _myObject[x][y][z].Insert(z, value);  
     } 
     else{ 
      _myObject[x][y][z] = value;  
     } 
    } 
} 
+1

どのように動作しませんか?あなたはより具体的になりますか?完全なコード例を投稿できますか?これは重要な部分を欠いている部分だけです。 –

+1

'_myObject [x] [y] [z] .Insert(z、new myObject());これは間違っています。あなたは無用な物を造っています。おそらく '_myObject [x] [y] [z] .Insert(z、value;')を書いて、 '_myObject [x] [y] [z] = value; 'を' if'のelseに入れてください。 – xanatos

+1

@ xanatos、無用なオブジェクトを作るのは不必要に非効率ですが、それは間違っていません。 – svick

答えて

2

境界を指定する必要がなく、要素を設定するときに拡張される多次元配列のようなものを作成したいと仮定しています。

この場合、コードに問題があるのはInsert()です。このメソッドを使用すると、既存のリストの途中にアイテムを挿入できますが、それを超えることはできません。したがって、リストが空の場合は、2に何かを挿入することはできません。

これを行う場合は、ループ内でAdd()を呼び出すことによってリストを手動で拡張する必要があります。

しかし、非常に疎な構造(つまり、ほとんどの要素が設定されていない)が予想される場合は、おそらくDictionary<int, Dictionary<int, Dictionary<int, T>>>のようなものを使用してください。

+0

私は、リストのポイントは動的に大きさがあると考えましたか? Countのリストのサイズを変更する必要がありますか? – afuzzyllama

+1

'List 'のポイントは、あなたが好きなだけ多くの項目を 'Add()'することができ、基本となる配列が動的にサイズ変更されるということです。しかし、リストの現在の終わりを超えて項目を挿入することはできません。 – svick

+0

辞書オブジェクトを使用しようとします。ありがとう! – afuzzyllama

関連する問題