如何在C#中循环遍历2D网格决策树?

3

我有一个对象列表,必须根据两个条件设置属性。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

有没有一种好的方法可以循环Property 1和Property 2来动态设置对象属性?未来可能会添加几个条件,我想多次使用if语句不是一个好的解决方案。我正在尝试避免冗余的代码。
谢谢。

半OT但是..有没有办法在那个问题中使用<pre>或等效的方式(以便表格不被语法突出显示),而无需替换所有被解释为HTML标记的'<'? - Andreas Bonini
不确定,我不会费心去做,目前它已经非常易读了。 - Ali Lown
是的,这是可能的,但你必须用 < 替换所有的 <。 - Joel Coehoorn
3个回答

2

如果你怀疑事物会经常变化,我建议使用数组查找。最好从数据库或外部文件加载数据(以使配置变得容易),但在这里我已经硬编码了数组:

        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
如果我们能将A和B的两种条件转化为一个0-3的系统:
如果A < 100 -> Ascale = 0
如果A < 120 -> Ascale = 1
等等。
同样,对于B:
如果B < 80 -> Bscale = 0
如果B < 100 -> Bscale = 1
等等。
然后我们可以使用一个二维数组来查找正确的输出响应:
out = arrayname[Ascale][Bscale];
但我认为这并没有比简单地硬编码为if语句节省任何东西,当只有少数几个额外的可能性时,我认为硬编码是最好的解决方案。

谢谢你的帮助,最终我决定像最后一段建议的那样硬编码。我将其标记为答案。 - jpsimard-nyx

0

class AbstractSetter { void SetObjectProperty(); }

class SetterLessThen100 : AbstractSettter { /* 实现 A<100 的情况下的代码 */}

实现一系列的 Setter 对象,对于每种可用的情况都作用于对象。将它们全部添加到 AbstractSetters 集合中,迭代它并调用 SetProperty() 抽象方法(在每个具体对象上进行重载)。如果将来有其他条件需要添加,只需实现新的 Setter 并将其添加到 AbstractSetters 集合中即可。

抱歉,我没有足够的时间编写所有代码,希望这很清楚。祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接