在设置中存储多种可能性

时间:2013-08-28 09:05:26

标签: c# c#-4.0

我有一个场景,我无法找到最好的方法,我想让它给我最大的可扩展性,并避免幻数编码。

基本上是一个简化的例子。

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

acceptableHeight:1000,2000,3000,4000 可接受的长度:500,600,700,800

我可以考虑存储这样的值的最佳方式:

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

我能想到的逻辑是

  1. 从配置中获取价值
  2. 用逗号分割成整数列表
  3. 对列表进行排序(以防万一)
  4. 某种搜索以找到最近的值(或使用最终值)
  5. 但我不是100%确定如何...

2 个答案:

答案 0 :(得分:0)

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

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

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

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

- 存在实现搜索树的几种方法,例如参见AVL TreeRed black tree

c#中的avl树的实现在这里; self-balancing-avl-tree

对于您的用例,这实际上是过度杀伤,因为只有在您启动程序时树才会发生变化。因此,您可能希望为此实现自己的搜索树。

您可以先对列表进行排序,然后再进行递归操作:

  • 如果列表为空,则不执行任何操作。
  • 选择列表的中间元素
  • 创建新节点作为当前树的顶级节点
  • 通过将左子项传递给所选元素之前的数字列表来创建左子项。
  • 通过在所选元素之后传递数字列表来创建正确的子项。

答案 1 :(得分:0)

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

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