Как я могу выполнить цикл в дереве решений 2D сетки в C #? - PullRequest
3 голосов
/ 18 января 2010

У меня есть список объектов, я должен установить свойство на основе двух критериев, 2D сетка выглядит так:

Property 2\Property 1   B<80        80<B<100       100<B<120           B>120
A < 100                 None          Red           Orange            Orange
100 < A < 120           None          Red           Orange             Green
120 < A < 140           None          Red           Green              Green
140 < A                 None         Orange         Green              Green

Есть ли хороший способ зациклить свойство 1 и свойство 2 для динамической установки свойства объекта? Вполне возможно, что в будущем мы добавим несколько критериев, и я предполагаю, что выполнение нескольких ifs не является хорошим решением. Я пытаюсь избежать избыточного кода.

Спасибо

Ответы [ 3 ]

2 голосов
/ 18 января 2010

Я бы порекомендовал использовать поиск по массиву, если вы подозреваете, что все будет часто меняться. Было бы лучше загрузить данные из базы данных или внешнего файла (чтобы упростить настройку), но здесь я жестко закодировал массивы:

        int[] alimits = new int[] { 100, 120, 140, int.MaxValue };
        int[] blimits = new int[] { 80, 100, 120, int.MaxValue };
        int aval = 125;
        int bval = 110;

        int aindex = 0;
        for (int i = 0; i < alimits.Count(); i++)
            if (aval < alimits[i])
                aindex = i;

        int bindex = 0;
        for (int i = 0; i < blimits.Count(); i++)
            if (bval < blimits[i])
                bindex = i;

        string[,] values = new string[,] {
            {"None", "Red", "Orange", "Orange"}, 
            {"None", "Red", "Orange", "Green"},
            {"None", "Red", "Green", "Green"},
            {"None", "Orange", "Green", "Green"}};

Это не проверено, но должно дать вам основную идею. Вы получите результат как values[aindex, bindex].

0 голосов
/ 18 января 2010

class AbstractSetter {void SetObjectProperty (); }

class SetterLessThen100: AbstractSettter {/ * Реализация кода для случая A <100 * /} </p>

Реализовать список установочных объектов, который действует над объектом для каждого доступного случая. Добавьте их все в коллекцию AbstractSetters, выполните итерации по ней и вызовите абстрактный метод SetProperty () (перегрузка каждого конкретного объекта). И в будущем, если вам нужно добавить какое-то другое условие, достаточно реализовать новый Setter и добавить его в коллекцию AbstractSetters.

Извините, у меня недостаточно времени для написания всего кода, надеюсь, это понятно. Удачи.

0 голосов
/ 18 января 2010

Если бы мы могли преобразовать 2 условия для A и B в систему со шкалой 0-3:
если A <100 -> Ascale = 0
иначе, если A <120 -> Ascale = 1
и т.п. и для B:
если B <80 -> Bscale = 0
иначе, если B <100 -> Bscale = 1
и т.д.

Тогда мы могли бы использовать 2d массив для поиска правильного выходного ответа:
out = arrayname [Ascale] [Bscale];

Но я не думаю, что это экономит что-то большее, чем просто жесткое кодирование, как если бы, когда есть возможность только нескольких дополнительных, я думаю, что жесткое кодирование - лучшее решение для этого.

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