如何建模独占行为并使其可配置

Kum*_*mar 5 .net c# logic rules

我们必须提供具有以下规则的选项列表

* 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 )
Run Code Online (Sandbox Code Playgroud)

最好用以下列出的汽车油箱列表示例进行说明

Gas
Diesel
Electric
BioFuel
Ethanol
Run Code Online (Sandbox Code Playgroud)

汽车可以选择多种燃料类型,例如

biofuel and Gas 
Gas and Electric
Gas, Ethanol and Biofuel

but not 
Diesel and Gas at the same time
Run Code Online (Sandbox Code Playgroud)

尝试提出一些可配置的逻辑,以便代码读取配置并应用规则而不是了解具体的esp.因为有另一个列表具有类似的约束

有关如何建模此行为的任何帮助/指示?

更新 -

感谢大家的好主意,最简单的解决方案似乎在配置文件/表中为每种燃料类型定义了一个不兼容类型列表,如下所示

FuelID/FuelName/IncompatibleTypes 1/Gas/2 2/Diesel/1 3/Electric/4/BioFuel/5/Ethanol/etc.

其中IncomatibleTypes是nvarchar(50),它将存储不兼容的类型,如2,5,6,......等.

因此代码将读取定义,如果选择了一个项目,它将读取其他所选项目,如果它在不可用列表中找到任何内容,它可以显示消息或只是自动取消选择其他不兼容项目等.

这可能是不优雅的,但似乎是最通用的解决方案,没有代码知道任何关于特定项目的东西,而且它可以像现实中一样自由扩展*如果不可能性列表增加了,最多可能会有十几个最大选择*可以将存储更改为nvarchar(100)而不对代码本身进行任何更改

var*_*bas 3

我会使用Dictionary带有每个键值列表的 a 。示例代码:

enum fuel { Diesel, Biofuel, Gas, Electric, Ethanol };
private void Form1_Load(object sender, EventArgs e)
{ 
    Dictionary<fuel, List<fuel>> dict = new Dictionary<fuel,List<fuel>>(); 

    dict.Add(fuel.Biofuel, new List<fuel>{fuel.Gas, fuel.Ethanol});
    dict.Add(fuel.Gas, new List<fuel>{fuel.Biofuel, fuel.Electric, fuel.Ethanol});
    //etc.

    fuel fuel1 = fuel.Biofuel;
    fuel fuel2 = fuel.Gas;

    if (dict[fuel1].Contains(fuel2) || dict[fuel2].Contains(fuel1))
    {
        //Both fuels can be put together
    }
    else
    {
        //Please, don't mix.
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法非常灵活,可以进行优化,这样您就不需要将所有燃料添加为键(也不需要每个键的所有潜在值)。此外,您不需要使用Enum. 这个答案的重点是提出一个基于由键和值列表定义的字典的解决方案,该字典仅考虑“有效组合”。