有效而清晰地评估六个条件

时间:2012-08-22 16:37:55

标签: c# performance algorithm validation nested-loops

我有以下(简化)条件需要针对我正在撰写的表单进行验证:

a> B'/ P>

a> ç

a> d

b> ç

b> d

c> d

从图形上看,这可以看作:

enter image description here

用户可以自由输入a,b,c和d的值,这就是为什么需要对其进行验证以确保遵守这些规则的原因。我遇到的问题是写一些清楚有效地评估每个陈述的东西。当然,最明显的方法是将每个语句分别作为if语句进行评估。不幸的是,这会占用很多代码行,而且我宁愿避免使用一堆if-blocks来完成同样的事情。我确实使用数组提出了以下嵌套的for循环解决方案。我构建了一个值数组,并将其循环两次(在类似Python的伪代码中演示):

A = [a, b, c, d]
for i in range(3):
    for j in range(i, 4):
        if i > j and A[i] >= A[j]:
            print("A[i] must be less than A[j]")
        else if i < j and A[i] <= A[j]:
            print("A[j] must be greater than A[i]")

我对此解决方案的问题是难以阅读和理解 - 解决方案并不清楚。

我有这种唠叨的感觉,那里有一个更好,更清晰的答案,但我无法想到它对我的生活。这不是家庭作业或任何事情 - 我实际上正在研究一个项目,这个问题(或它的微妙变化)不止一次出现,所以我想制作一个清晰有效的可重用解决方案。任何输入将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:6)

if a > b > c > d:
    do ok
else:
    for x in range(3):
        if A[i] <= A[i+1]:
             print A[i], ' not greater than', A[i+1]

答案 1 :(得分:2)

如果你不能假设比较的传递性:

from itertools import combinations
for x, y in combinations(A, 2):
    if x <= y:
        print("{} not greater than {}".format(x, y))

否则,f p的解决方案是最佳的。

答案 2 :(得分:0)

您可以为每个检查创建委托,并将这些委托添加到数组中。创建适当的委托,比如bool LargerCheck(a,b,字符串错误)并将它们添加到一个可以循环遍历的数组中......

虽然更具可读性,但工作量很大,而且更复杂。我想我只是将凌乱的支票隐藏在一个验证块中,并且在普通代码中有一个易于阅读的单一检查。像这样的东西;

// Simple readable check in normal code
if (!ValidationOk(a,b,c,d,response) 
{
  ShowResponse(response);
  Break;
}


// messy routine
private bool ValidationOk(a,b,c,d,List<string> valerrors)
{
  valerrors.Clear();
  if (a<b) valerrors.Add("a < b");
  if (a<c) valerrors.Add("a < c");
  ....
  return valerrors.Count == 0;
}