2011-06-26 43 views
0

我的程序有一个单元格网格,我希望能够按行或按列号高效查询。我应该用什么样的结构来做到这一点?如何使用复合键从字典中获取值?

比如我想有以下几种方法:

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

我的第一次尝试是创建两个字段(行和列),然后字典的结构与结构的组合键:Dictionary<struct, cell>

CellsCollection.GetCell(Int32 row, Int32 column)是没有问题的,因为我会查询组合键的字典。

另外两个(获得行/列细胞)目前的问题,因为如果我这样做:

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

然后辞典键将失去意义,程序要经过字典中的每一个关键。

我想到了一个嵌套的字典(外部的一个行键和内部的一个列键),但我只会帮助,如果我按行查询,而不是列。

你会如何克服这一点?

回答

3

如果您的索引中存在空白,字典是非常好的。如果你有一个单元格网格,那么我猜测情况并非如此(除非你有很多空单元格)。因此,为什么不有一个二维数组?例如

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

相关问题