复杂的if else逻辑

6

朋友们

我该如何实现以下复杂逻辑?

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

function (string flag1, string flag2, string flag3) begin

该函数需要返回:

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

  2. 否则,如果flag1、flag2和flag3都是“A”,则返回“Active”

  3. 否则,如果flag1、flag2和flag3都是“I”,则返回“Inactive”

  4. 否则,如果flag1、flag2和flag3是“A” AND “I”(OR “N”),则返回“both”

例如:1)flag1为“A”,flag2为“I”,flag3为“I”
例如:2)flag1为“I”,flag2为“A”,flag3为“I”
例如:3)flag1为“A”,flag2为“N”,flag3为“I”

返回结果

end

谢谢回复,但没有一个帖子给出答案。我知道if else结构,正在寻找实现上述伪代码的逻辑。所有四种情况都是可能的,特别是#4是复杂的,需要知道如何实现。


4
你实际上是在询问如何构建布尔逻辑吗?还是正在寻找其他方法来完成此操作? - Kirk Woll
@Kumar:你想让我们将你的伪代码翻译成C#吗?这几乎是直截了当的。 - Doc Brown
1
我们应该如何理解第4点?现在这些括号毫无意义。 - H H
4
这个需要一个“真值表”来解决。或者他们不再教这个了吗? - Robaticus
1
你的例子没有意义。请提供flag1、flag2、flag3的表格,以及所有可能输入值的预期返回值。 - thecoop
显示剩余2条评论
5个回答

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
}

2
摆脱else,如果if为真,则已经返回。否则+1,因为您能够理解发布的神秘要求..假设您的解释是准确的.. - Jimmy Hoffa
2
哎,else 是多余的,但它确实能让逻辑更加明显。 - thecoop
2
作为一条注释,enum 使得类型更加安全,但仍然有可能发送无效的输入。您可以将任何整数值转换为特定的 enum 类型。(我也建议使用 enum。只是不想让人们产生虚假的安全感。) - Matthew Whited
如果flag1、flag2和flag3都是"A"和"I"(或"N")的话,返回"both"。否则返回其他值。实际上我正在寻找这个逻辑的实现方式。这意味着flag1、flag2和flag3中必须同时存在"A"和"I",而其余的标志可以是"N",也可以是"A"和"I"。请参见我的第4个示例。 - Kumar
希望他能把这个从我这里转给你。我试图删除我的答案,但它不允许我这样做,因为它已被接受。 - Matthew Whited

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);
}

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)

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";
  }



 }

你曾经为糟糕的代码辩护,所以没有理由在这里被否决。 - Loren Pechtel

0

Robaticus在评论中给出了正确的答案,但我会进一步扩展。

我们有三个标志,每个标志可以有三种状态。因此,有27种可能的选项。

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

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

private int ParseFlag(string Flag) { switch (Flag) { case "N": return None; case "I": return Inactive; case "A": return Active; default throw new Exception(string.Format("Got a flag value of {0} but expected N, I or A", Flag)); } }

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

我会让你构建这个数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接