2011-06-26 14 views
0

私のプログラムにはセルのグリッドがあり、効率的に行または列番号のどちらかを照会できるようにしたいと考えています。これを行うにはどのような構造を使うべきですか?コンポジットキーで辞書から値を取得する方法は?

たとえば、私は次のメソッドを持っているしたいと思います。私の最初の試みは、構造体の複合キーと2つのフィールド(行と列)と辞書を持つ構造体を作成することでした

CellsCollection.GetCell(Int32 row, Int32 column) 
CellsCollection.GetAllCellsInRow(Int32 row) 
CellsCollection.GetAllCellsInColumn(Int32 column) 

Dictionary<struct, cell>

CellsCollection.GetCell(Int32 row, Int32 column)は、コンポジットキーで辞書にクエリするので問題ありません。

他の2つは(行/列のセルを取得する)私がしなければため、問題を提示:

dictionary.Where(keyPair=>keyPair.Key.Row == row).Select(keyPair=>keyPair.Values.Cell) 

次に辞書のキーは、議論の余地になり、プログラムが辞書内のすべてのキーを通過しなければなりません。

私はネストされた辞書(行キーを持つ外側のものと列キーを持つ内側のもの)を考えましたが、私は列ではなく行で照会している場合にのみ役立ちます。

これをどのように克服しますか?

答えて

3

インデックスにギャップがある場合は、辞書が最適です。あなたがグリッドのセルを持っているなら、私はそれがそうでないと推測しています(あなたに空のセルがたくさんある場合を除きます)。

なぜ、2次元配列を持たないのですか?例えば

int[,] cells = new int[maxRow,maxColumn]; 

そのようにあなたが特定のセルを照会したい場合は、行のすべてを取得したい場合は、あなただけの

int cellValue = cells[row,column] 

または

public int GetCell(Int32 row, Int32 column) 
{ 
    return cells[row, column] 
} 

の操作を行います。

for(int col = 0; col < maxColumn; col++) 
    int cellValue = cells[row, col]; 

または

public IEnumerable<int> GetAllCellsInRow(Int32 row) 
{ 
    for(int col = 0; col < maxColumn; col++) 
     yeldReturn cells[row, col]; 
} 

と同様

for(int row = 0; row < maxRow; row++) 
    int cellValue = cells[row, column]; 

または

public IEnumerable<int> GetAllCellsInColumn(Int32 column) 
{ 
    for(int row = 0; row < maxRow; row++) 
     yield return cells[row, column]; 
} 
+0

列内のすべてのためにそれはそれだけでうまくいくかもしれないので、クレイジーです!今度はもっと多くの行/列が必要になるので、配列のサイズを変更する必要はありませんか? (私はちょうど場合のために行と列の最大数を割り当てることはできません)。 – Manuel

+0

辞書と配列の両方でテストしたところ、配列の方が高速でメモリも少なくて済みました。 – Manuel

関連する問題