2010-08-02 113 views
6

好友复杂如果逻辑

如何实现以下复杂逻辑?

FLAG1可以是 “N” 或 “A” 或 “I”
FLAG2可以是 “N” 或 “A” 或 “I”
Flag3相同的可以是 “N” 或 “A” 或 “I”

功能(串FLAG1,串FLAG2,串相当于Flag3) 开始

的函数需要返回:

  1. 返回 “无” 如果FLAG1,FLAG2和相当于Flag3是 “N”

  2. 否则返回 “激活” 如果FLAG1,FLAG2和Flag3相同的是 “A”

  3. 否则返回 “无效”,如果FLAG1,FLAG2和Flag3相同的是 “我”

  4. 否则返回 “这两个” 如果flag1,flag2和flag3是“A”和“I”(或“N”)

eg 1)标志1是“A”并且标志2是“I”并且标志3是“I”0123。 2)标志1是“I”并且标志2是“A”并且标志3是“I”0123。 2)标志1为 “A” 和FLAG2是 “N” 和Flag3相同的是 “我”

retrun结果

感谢您的答复,但没有后给出答案。我知道是否有其他的方法来限制和寻找逻辑来实现上面的psedocode。所有四个都是可能的条件,特别是#4是复杂的,需要知道如何实现。

+4

你真的在问如何编写布尔逻辑吗?或者你在寻找替代方案吗? – 2010-08-02 19:43:56

+0

@Kumar:您是否希望我们将您的伪代码转换为C#,这将几乎简单明了? – 2010-08-02 19:48:31

+1

我们应该如何阅读第4点?那些parens现在没有意义。 – 2010-08-02 19:49:24

回答

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

+1为枚举...和3行soln到一个臃肿的Q :) – Vishal 2010-08-02 19:48:37

+0

+1为简单单如果/ else – 2010-08-02 19:50:28

+2

摆脱其他,你已经返回,如果if为true 。否则+1能够找出发布的奥术要求。假设你的解释是准确的.. – 2010-08-02 19:50:34

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



} 
+0

我欢迎消极。因为我知道它不好;) – Nix 2010-08-02 20:04:52

+0

你证明了错误的代码是正确的,没有理由在这里投票。 – 2010-08-02 20:35:44

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

Robaticus给你正确的答案,但在评论,而不是一个职位,所以我会在其扩张。

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

当面对复杂的if..then逻辑和这样一个小地址空间时,根本无法尝试编写所有if..then的代码。相反,一个三维数组总共包含27个元素。

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

私人INT ParseFlag(串标志) { 开关(标志) { 情况下 “N”:返回None; case“I”:return Inactive; 情况“A”:返回活动; 默认抛出新的异常(string.Format(“有一个标志值为{0}但期望N,我或A”,标志)); } }

公共FlagResult查找(字符串的Flag1,Flag2相同的字符串,字符串相当于Flag3) { 返回FlagData [ParseFlag(标记1),ParseFlag(标志2),ParseFlag(相当于Flag3)];我想让你建立数组。