在设置中存储多种可能性



我脑子里有一个场景,我无法找到最好的方法,我希望它能给我最大的可扩展性,避免幻数编码。

本质上,一个简化的例子就是这样。

用户输入一个数字(比如5326)我的系统会将这个数字向下或向上四舍五入到列表中最接近的"可接受值"。我希望这个列表是可配置的。另外请注意,不同的变量有不同的列表,例如

可接受高度:1000200030004000可接受长度:500600700800

我能想到的最好的存储值的方法是:

<appSettings>
    <add key="acceptableHeight" value="1000,2000,3000,4000" />
    <add key="acceptableLength" value="500,600,700,800" />
</appSettings>

我能想到的逻辑是

  1. 从配置中获取值
  2. 用逗号拆分为整数列表
  3. 对列表进行排序(以防万一)
  4. 通过某种搜索来查找最近的值(或使用最终值)

但我不能100%确定如何。。。

您可以将其存储为字符串,并按照建议进行解析。

int[] acceptableHeight = AppSetting["acceptableHeight"].Split(',').Select(x => int.Parse(x));

您需要将列表存储为搜索树。-创建搜索树需要对列表进行排序。

搜索树是一种保证中缀树遍历将按排序顺序访问存储值的树。对于二进制搜索树,即每个节点最多有两个子节点的树,这意味着每个节点的值都大于其左子树中的所有节点,小于其右子树中的全部节点。

优选地,搜索树也应该是平衡的,这意味着每个子树都有接近相等的深度。

有了搜索树,那么在O(logn)时间内确定最接近的最大值和最接近的较小可接受值对应该是微不足道的。从它们到最接近值的步骤是基本算术。

-存在几种实现搜索树的方法,例如参见AVL树或红黑树。

这里是一个avl树在c#中的实现;自平衡avl树

对于您的用例来说,这实际上是过分的,因为树只有在您启动程序时才会更改。因此,您可能需要为此实现自己的搜索树。

你可以先对列表进行排序,然后递归:

  • 若列表为空,则不执行任何操作
  • 选择列表的中间元素
  • 创建一个新节点作为当前树的顶部节点
  • 通过在所选元素之前向其传递数字列表来创建左侧子项
  • 通过在所选元素之后向其传递数字列表来创建正确的子元素

最新更新