Как получить значения из словаря с составными ключами? - PullRequest
0 голосов
/ 27 июня 2011

В моей программе есть сетка ячеек, и я хочу иметь возможность эффективно выполнять запросы либо по строке, либо по номеру столбца.Какую структуру я должен использовать для этого?

Например, я хотел бы использовать следующие методы:

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)

Тогда ключ словаря становится спорным, и программа должна пройти через каждый ключ в словаре.

Я подумал о вложенном словаре (внешнем с ключом строки ивнутренний с ключом столбца), но мне это поможет, только если я опрашиваю по строке, а не по столбцу.

Как бы вы преодолели это?

1 Ответ

3 голосов
/ 27 июня 2011

Словарь хорош, если у вас есть пробелы в ваших индексах. Если у вас есть сетка ячеек, то я думаю, что это не так (если у вас нет много пустых ячеек).

Так почему бы не иметь двумерный массив? например,

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];
}
...