我有一个场景,我无法找到最好的方法,我想让它给我最大的可扩展性,并避免幻数编码。
基本上是一个简化的例子。
用户输入一个数字(比方说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>
我能想到的逻辑是
但我不是100%确定如何...
答案 0 :(得分:0)
您需要将列表存储为搜索树。 - 创建搜索树将涉及对列表进行排序。
搜索树是一种树,它保证中缀树遍历将按排序顺序访问存储的值。对于二叉搜索树,即每个节点最多有两个子节点的树,这意味着每个节点的值都大于其左子树中的所有节点,并且小于其右子树中的所有节点。
优选地,搜索树也应该是平衡的,这意味着每个子树的深度都接近相等。
在搜索树到位后,确定O(log n)时间内最接近的最大和最接近的较小可接受值对应该是微不足道的。从它们到最接近的值的步骤是基本算术。
- 存在实现搜索树的几种方法,例如参见AVL Tree或Red black tree。
c#中的avl树的实现在这里; self-balancing-avl-tree
对于您的用例,这实际上是过度杀伤,因为只有在您启动程序时树才会发生变化。因此,您可能希望为此实现自己的搜索树。
您可以先对列表进行排序,然后再进行递归操作:
答案 1 :(得分:0)
您可以将其存储为字符串并按照建议进行解析。
int[] acceptableHeight = AppSetting["acceptableHeight"].Split(',').Select(x => int.Parse(x));