Самым простым решением, вероятно, будет использование Dictionary<Tuple<string, string>, int>
, при условии, что вы используете .NET 4. Это будет работать примерно так:
private readonly Dictionary<Tuple<string, string>, int> Table =
new Dictionary<Tuple<string, string>, int>
{
{ Tuple.Create("A1", "A"), 1 },
{ Tuple.Create("A1", "B"), 2 },
{ Tuple.Create("A1", "C"), 3 },
{ Tuple.Create("B1", "A"), 4 },
{ Tuple.Create("B1", "B"), 5 },
{ Tuple.Create("B1", "C"), 6 },
{ Tuple.Create("C1", "A"), 7 },
{ Tuple.Create("C1", "B"), 8 },
{ Tuple.Create("C1", "C"), 9 },
};
public int this[string row, string column]
{
get
{
return Table[Tuple.Create(row, column)];
}
}
Если вы не используете .NET 4Вы могли бы подделать его, соединив строку и столбец вместе, например, связав их и добавив косую черту: "A / A1", "B / B1" и т. д., а затем получив Dictionary<string, int>
.Хотя это довольно уродливо - я бы соблазнился написать свою собственную структуру RowColumn, чтобы избежать этого.
Другой альтернативой может быть сохранение двух словарей, каждый из которых отображает имена строк или столбцов в индексы, а затем int[,]
массив для значений.Это дает преимущество, которое вы можете определить, когда строка или столбец недействительны.Если у вас действительно есть только несколько строк или столбцов, простой список строк, вероятно, будет таким же быстрым или быстрым:
private readonly List<string> RowNames = new List<string> { "A1", "B1", "C1" };
private readonly List<string> ColumnNames = new List<string> { "A", "B", "C" };
private readonly int[,] Values = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
public int this[string row, string column]
{
get
{
int rowIndex = RowNames.IndexOf(row);
if (rowIndex == -1)
{
throw new ArgumentOutOfRangeException("Invalid row specified");
}
int columnIndex = ColumnNames.IndexOf(column);
if (columnIndex == -1)
{
throw new ArgumentOutOfRangeException("Invalid column specified");
}
return Values[rowIndex, columnIndex];
}
}