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

标签 c# .net 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 )

下面的汽车燃油列表示例可以很好地解释这一点

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/

相关文章:

c# - 既然我们有了泛型,是否还需要 EventArg 类

c# - 在 ASP.NET 页面中将项目从一个列表拖放到另一个列表?

c# - .NET 世界是否有日志外观?

c# - 强制 trackbar 值为十倍

C# 代码仅在单步执行时给出预期结果?

c# - 关于泛型、继承和链接的棘手问题

c# - 在自定义类的 IEnumerable 中对具有特定 ID 的项目求和

c - 递归函数怎么会返回一些东西?

php - 在 PHP 上解析 JSON 并提取特定值

c# - 在 Azure 中设置 ASP.NET Core Web 应用程序的 SQL 连接字符串