复杂的if else逻辑

时间:2010-08-02 19:42:48

标签: c# logic

如何实现以下复杂逻辑?

flag1可以是“N”或“A”或“I”
flag2可以是“N”或“A”或“I”
flag3可以是“N”或“A”或“I”

function(string flag1,string flag2,string flag3) 开始

该功能需要返回:

  1. 如果flag1,flag2和flag3为“N”则返回“None”

  2. 如果flag1,flag2和flag3为“A”,则返回“Active”

  3. 如果flag1,flag2和flag3为“I”,则返回“Inactive”

  4. 如果flag1,flag2和flag3是“A”和“I”(或“N”)

  5. ,则返回“both”

    e.g。 1)flag1是“A”,flag2是“I”,flag3是“I” 例如2)flag1为“I”,flag2为“A”,flag3为“I” 例如2)flag1为“A”,flag2为“N”,flag3为“I”

    后退结果

    感谢您的回复,但帖子都没有回答。我知道是否有其他约束和寻找逻辑来实现上面的psedocode。所有四个都是特殊的条件#4很复杂,需要知道如何实现它。

5 个答案:

答案 0 :(得分:20)

你对第4点的逻辑令人困惑......

我会为此使用枚举值,而不是字符串 - 它更加类型安全(例如,如果有人将"WIBBLEWOBBLE"传递给您的方法会怎么样?它应该返回什么?)

enum Value { None, Active, Inactive, Both }

private Value GetValue(Value flag1, Value flag2, Value flag3) {
    if (flag1 == flag2 && flag2 == flag3)    // they are all the same
        return flag1;
    else return Value.Both;    // there is a difference
}

答案 1 :(得分:2)

[Flags]
enum SomeWierdReturn
{ Both = 0, None = 1, Active = 2, Inactive = 4 }

public SomeWierdReturn DoSomething(SomeWierdReturn flag1, SomeWierdReturn flag2, SomeWierdReturn flag3)
{
    return (SomeWierdReturn)(flag1 & flag2 & flag3);
}

答案 2 :(得分:1)

如果您首先检查所有3个值是否相等,我认为它既有可读性又有速度。

if ((flag1 == flag2) and (flag1 == flag3))
   // use a switch or table to go 'I' -> Inactive etc
else
  return "Both"; // as far as i understood 4)

答案 3 :(得分:0)

这会起作用。不能说我喜欢它。

 string key = flag1 + flag2 + flag3;
 switch(key){
     case "NNN":
         return "None";
      case "AAA":
        return "Active";
      case "III":
        return "Inactive";
      default:
        break;
  }
  // ;)
 //Trying to make it as confusing as your requirement #4
  var four = (
     from s in key
     select s
   ).Distinct();

  if(four.Count() > 1){
    return "Both";
  }



 }

答案 4 :(得分:0)

Robaticus给了你正确的答案,但是在评论而不是帖子中,所以我会扩展它。

我们有三个标志,可以采取三种状态中的每一种。因此有3 * 3 * 3 = 27种可能的选择。

当面对复杂的if..then逻辑和如此小的地址空间时,尝试编写所有if..then的代码毫无意义。相反,一个三维数组共包含27个元素。

const int None = 0; const int Inactive = 1; const int Active = 2;

private int ParseFlag(string Flag) {     开关(旗帜)     {         案例“N”:返回无;         案例“我”:返回非活动;         案例“A”:返回活动;         default throw new Exception(string.Format(“得到标志值为{0}但预期为N,I或A”,标志));     } }

public FlagResult Lookup(string Flag1,string Flag2,string Flag3) {      return FlagData [ParseFlag(Flag1),ParseFlag(Flag2),ParseFlag(Flag3)]; }

我会让你构建数组。