Vil*_*lx- 1 boolean-expression
我有三个布尔值A,B和C.我需要编写一个IF语句,当且仅当这些值中不超过一个为True时才会执行.换句话说,这是真值表:
A | B | C | Result
---+---+---+--------
0 | 0 | 0 | 1
0 | 0 | 1 | 1
0 | 1 | 0 | 1
0 | 1 | 1 | 0
1 | 0 | 0 | 1
1 | 0 | 1 | 0
1 | 1 | 0 | 0
1 | 1 | 1 | 0
Run Code Online (Sandbox Code Playgroud)
写这个的最好方法是什么?我知道我可以列举所有可能性,但这似乎......太冗长了.:P
补充:刚才有一个想法:
!(A && B)&&!(B && C)&&!(A && C)
这将检查没有设置两个值.关于总和的建议也是可以的.更可读也许......
(A≥1:0)+(B≤1:0)+(C≥1:0)<= 1
PS这是用于生产代码,所以我的代码可读性要高于性能.
补充2:已经接受的答案,但对于好奇的答案 - 它是C#.:)这个问题几乎与语言无关.
Dav*_*und 11
如何将它们视为整数1和0,并检查它们的总和等于1?
编辑:
既然我们知道它是c#.net,我认为最具可读性的解决方案看起来有点像
public static class Extensions
{
public static int ToInt(this bool b)
{
return b ? 1 : 0;
}
}
Run Code Online (Sandbox Code Playgroud)
上面隐藏在一个类库(appcode?)中,我们没有看到它,但可以轻松访问它(例如ctrl +在r#中单击),然后实现将只是:
public bool noMoreThanOne(params bool[] bools)
{
return bools.ToList().Sum(b => b.ToInt()) <= 1;
}
Run Code Online (Sandbox Code Playgroud)
...
bool check = noMoreThanOne(true, true, false, any, amount, of, bools);
Run Code Online (Sandbox Code Playgroud)
(A或B XOR C)或不(A或B或C)
编辑:正如Vilx所指出的,这是不对的.
如果A和B均为1,且C为0,则A XOR B为0,整体结果为0.
怎么样:NOT(A和B)和NOT(A和C)和NOT(B和C)
| 归档时间: |
|
| 查看次数: |
3483 次 |
| 最近记录: |