【问题标题】:Complex if else logic复杂的 if else 逻辑
【发布时间】:2011-03-24 09:37:26
【问题描述】:

朋友

如何实现以下复杂的逻辑?

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

函数(字符串标志1,字符串标志2,字符串标志3) 开始

函数需要返回:

  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”),则返回“both”

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

返回结果

结束

感谢您的回复,但没有一个帖子给出答案。我知道如果其他构造并寻找逻辑来实现上述psedocode。这四个都是可能的条件,特别是#4很复杂,需要知道如何实现它。

【问题讨论】:

  • 您实际上是在问如何编写布尔逻辑吗?还是您正在寻找替代方案?
  • @Kumar:您希望我们将您的伪代码翻译成 C#,这几乎是直截了当的吗?
  • 我们应该如何阅读第 4 点?那些括号现在没有意义了。
  • 这迫切需要一个“真值表”。还是他们不再教那些了?
  • 你的例子没有意义。请为所有可能的输入值提供一个包含 flag1、flag2、flag3 和预期返回值的表格。

标签: c# logic


【解决方案1】:

您对第 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
}

【讨论】:

  • 去掉else,如果if为真,你已经返回了。否则 +1 表示能够弄清楚发布的神秘要求。假设您的解释是准确的..
  • 嗯,else 是多余的,但它确实使逻辑是什么很明显
  • 请注意,enum 使这种类型更加安全,但仍然可以发送无效输入。您可以将任何整数值转换为特定的enum 类型。 (我也建议使用enum。我只是不希望人们获得虚假的安全感。)
  • 4.else 如果 flag1、flag2 和 flag3 是“A”和“I”(或“N”),则返回“both”——实际上我正在寻找这个逻辑的实现。这意味着在flag1、flag2和flag3中必须同时存在“A”和“I”,并且remaning flag可以是“N”,也可以是“A”和“I”。请参阅我的 #4 示例
  • 希望他能把这个从我交给你。我试图删除我的答案,但它不允许我,因为它已被接受。
【解决方案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);
}

【讨论】:

    【解决方案3】:

    如果您首先检查所有 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)
    

    【讨论】:

      【解决方案4】:

      这会*工作。不能说我喜欢。

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

      【讨论】:

      • 你证明了错误的代码是合理的,你没有理由在这里被否决。
      【解决方案5】:

      Robaticus 给了你正确的答案,但在评论而不是帖子中,所以我将对其进行扩展。

      我们有三个标志,可以分别代表三种状态。因此有 3 * 3 * 3 = 27 个可能的选项。

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

      const int None = 0; 常量 int 非活动 = 1; const int Active = 2;

      private int ParseFlag(字符串标志) { 开关(标志) { 案例“N”:返回无; 案例“I”:返回不活动; 案例“A”:返回活动; default throw new Exception(string.Format("得到一个标志值 {0} 但预期为 N、I 或 A", Flag)); } }

      public FlagResult Lookup(string Flag1, string Flag2, string Flag3) { 返回标志数据[ParseFlag(Flag1), ParseFlag(Flag2), ParseFlag(Flag3)]; }

      我会让你构建数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-24
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多