友
如何实现以下复杂逻辑?
flag1可以是“N”或“A”或“I”
flag2可以是“N”或“A”或“I”
flag3可以是“N”或“A”或“I”
function(string flag1,string flag2,string flag3) 开始
该功能需要返回:
如果flag1,flag2和flag3为“N”则返回“None”
如果flag1,flag2和flag3为“A”,则返回“Active”
如果flag1,flag2和flag3为“I”,则返回“Inactive”
如果flag1,flag2和flag3是“A”和“I”(或“N”)
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很复杂,需要知道如何实现它。
答案 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)]; }
我会让你构建数组。