我们必须提供一个符合以下规则的选项列表
* you can select multiple items, as many as you want
* however, some of the items are mutually exclusive, i.e. selecting itemA should automatically deselects itemC ( if itemC is selected prviously )
下面的汽车燃油列表示例可以很好地解释这一点
Gas
Diesel
Electric
BioFuel
Ethanol
一辆汽车可以选择多种燃料类型,例如
biofuel and Gas
Gas and Electric
Gas, Ethanol and Biofuel
but not
Diesel and Gas at the same time
尝试提出一些可配置的逻辑,以便代码读取配置并应用规则,而不是了解具体情况,尤其是。因为还有另一个列表有类似的限制
关于如何模拟此行为的任何帮助/指示?
更新-
感谢大家的好主意,最简单的解决方案似乎是在配置文件/表中为每种燃料类型定义一个不兼容类型的列表,如下所示
燃料 ID/燃料名称/不兼容类型 1/气体/2 2/柴油机/1 3/电动/ 4/生物燃料/ 5/乙醇/ 等等
IncomatibleTypes 是 nvarchar(50) 并将存储不兼容的类型,例如 2、5、6 等。
因此代码将读取定义,如果选择了一个项目,它将读取其他选定的项目,如果在不兼容列表中找到任何内容,它可以显示一条消息或简单地自动取消选择其他不兼容的项目等。
这可能不够优雅,但似乎是最通用的解决方案,代码根本不知道任何特定项目,而且它可以像现实中一样自由扩展 *最多可能会有几十个最大选择 * 如果不兼容列表增加,则可以将存储更改为 nvarchar(100),而无需对代码本身进行任何更改
最佳答案
我很可能会编写一个属性或函数,在第一次需要时加载配置(或者只是在应用程序加载时加载它,具体取决于场景)。之后我会为每个可能的值分配一个位(因此它们由 2 的幂表示),并将规则存储为数字。当检查组合是否有效时,我只是遍历项目列表,并检查是否有与检查规则兼容的数字。最简单的情况是,如果您列出所有可接受的组合,然后在其上运行 .Any 表达式,并在未找到任何内容时抛出异常,或者相反,您存储禁止的组合,并在发现某些东西时抛出异常找到了。
这种方法比使用字典要快得多。如果您需要性能,您甚至可以实现一些有效的数据结构来找到正确的 key 。
例如:
Name | Value
----------------------
Gas | 00001 = 1
Diesel | 00010 = 2
Electric | 00100 = 4
BioFuel | 01000 = 8
Ethanol | 10000 = 16
可能的值是:
Combination | Value
----------------------
Biofuel + Gas | 01001=9
Gas + Electric| 00101=5
etc.
当你需要检查Biofuel + Gas时,你检查9。发现,一切正常。 当您需要检查柴油和汽油时,您检查 3。没有找到,您抛出异常。
关于c# - 如何建模独占行为并使其可配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006648/