Как заменить логику цикла if для моего secnario? - PullRequest
1 голос
/ 17 ноября 2010
    A   B   C
A1  1   2   3
B1  4   5   6
C1  7   8   9

Используя вышеупомянутое (как таблица), собираем значение для данного значения заголовка.например: if (column = "A" && row = "B1"), затем value = "4"

без использования часто используемых циклов if. Есть ли идея извлечь значения с помощью C #.

Примечание: Вышеприведенное не является таблицей или структурой, получающей форму БД или какие-либо объекты памяти. Это просто отображение значения для заданных значений заголовка.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Самым простым решением, вероятно, будет использование 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];
    }
}
2 голосов
/ 17 ноября 2010

Вы можете иметь Dictionary<Tuple<string, string>, int>; см Tuple. Вам нужно решить, подходит ли вам этот вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...