C# 如果三个参数中只有一个或两个为True,则返回True的代码

C# 如果三个参数中只有一个或两个为True,则返回True的代码,c#,.net,programming-languages,C#,.net,Programming Languages,我需要一个返回True的代码,如果三个参数中只有一个或两个为True 最短/最好的方法是什么?只需检查是否至少设置了一个值,而不是全部设置了三个值: bool result = (a | b | c) & !(a & b & c); 编辑:在被评论者纠缠之后true==x删除。。。抱歉-这是一个“编码标准”文档,我必须遵循一次 LINQ方式: bool[] params = { true, false, true }; int count = params.Count(

我需要一个返回True的代码,如果三个参数中只有一个或两个为True


最短/最好的方法是什么?

只需检查是否至少设置了一个值,而不是全部设置了三个值:

bool result = (a | b | c) & !(a & b & c);
编辑:在被评论者纠缠之后
true==x
删除。。。抱歉-这是一个“编码标准”文档,我必须遵循一次

LINQ方式:

bool[] params = { true, false, true };
int count = params.Count(a => a);
bool result = count == 2 || count == 1;
这应该可以

return !((a & b & c) || (!a & !b & !c))

将布尔值放入列表中,然后使用linq进行过滤:

var options = new List<bool>() { true, true, false };
var trueOptions = options.Where( opt => opt };
var count = trueOptions.Count();

return count == 1 || count == 2;
var options=newlist(){true,true,false};
var trueOptions=options.Where(opt=>opt};
var count=trueOptions.count();
返回计数=1 | |计数=2;
这里有一个奇特的方法:

bool oneOrTwoTrue = a ? (!b || !c) : (b || c);
如果设置了第一个布尔值,则应取消设置剩余的任意一个布尔值。否则,应设置剩余的任意一个布尔值


编辑-回应评论:在生产代码中,我可能会选择@AS-CII或@Stuart;它最清楚地传达了计算内容的意图。

由于我之前的回答太长,我将重试:

bool result = !(a && b && c) && (a || b || c)
bool MySecondAnswer(params bool[] list)
{
   return list.GroupBy(x => x).Count() == 2;
}

另一个答案…我喜欢这个问题

bool MyThirdAnswer(params bool[] list)
{
   return list.Distinct().Count() == 2;
}

我对这个问题上瘾了

bool MyFourthAnswer(bool a, bool b, bool c)
{
   return (a != b) || (b != c);
}

我的最终答案…诚实

我想到的一个问题是,这是否真的是应该使用3个布尔的情况

与其使用3个bool,不如使用[Flags]枚举更合适,这样可以使代码更快、更可读、更可用

这方面的代码可能是:

[flags]
enum Alarm
{
   None = 0x0,
   Kitchen = 0x1,
   Bathroom = 0x2,
   Bedroom = 0x4,
   All = Kitchen | Bathroom | Bedroom,
}

bool MyFifthAnswer(Alarm alarmState)
{
   switch (alarmState)
   {
       case Alarm.None:
       case Alarm.All:
          return false;
       default:
          return true;
   }
}

出于兴趣,原始问题中的3个布尔是什么?

只是为了好玩,如果真=1和假=0:

return (a + b + c) % 3
另一个,假设false=0,true=任意严格正整数:

return (a*b + b*c + c*a) > (3*a*b*c)

当你可以进行6次乘法并使其完全模糊时,为什么还要坚持使用两次比较/布尔运算?;-)

这是一个非常有趣的问题-我不得不用Clojure(我正在学习的一种语言)来尝试它

好问题
我的答覆是:

return (a||b||c) != (a&&b&&c)
bash中的69个字符

x (){ test "$(echo $@|sed 's/ /\n/g'|sort|uniq|grep -c .)" == "2"; }
python中的32个字符

def x(a,b,c):return a!=b or b!=c


@马库斯特:如果任何一个都是真的,那就是真的,包括它们都是真的。如果这三个都是真的呢?@邪恶采样器:他的例子中没有包括所有的真。对于一个,两个或三个,我暗示任何。规范有点模糊。@Markust:“如果只有”与我书中的“如果并且只有如果”相同。但是是的,这个问题本可以更清楚。是的。这就是为什么我添加代码不是作为答案,而是作为注释。不确定。:)虽然我很喜欢摆弄布尔代数,但我真的很喜欢这个。(Missis one等于号,并且
==true
部分可以删除)。同意-它应该是
true==x
:)这将起作用,但是这不是最短的方法。最初对“all false”不起作用-但现在你已经修复了它!这不是使用linq的情况,它的速度要慢得多。如果没有一个输入为真,则返回真。不过我喜欢这个主意。一点;为什么不计数=1 |计数=2?我刚测试过,linq的速度是IMO的15倍@艾迪亚卡比:我没有做过这样的事事实上,我最初误解了这个问题,我的第一个答案会给出一个完全错误的结果。@Aidiakapi你的第一个答案也是错误的,这可能就是原因。当我注意到我的答案是错误的时,我删除了它,只有在更正后才取消删除它,这正是为了避免投反对票。@Konrad Rudolph我的第一个答案在几秒钟内被更正,这是因为我误解了它。我认为其中只有一个是真的,所以我有了
a | | b | c
。。。但我不明白为什么人们会投票支持linq,我的意思是你实际上是想让它的强度比实际强度高1000倍:S。我将对它进行基准测试。@Aidiakapi:考虑性能很可能(假设这不是时间关键组件中某个内部循环的核心部分)没有抓住重点。LINQ代码片段清楚地反映了“1或2为真”的思想,通过计算真值并比较它们的计数。@delnan那么你是说存储一个计数,然后在该计数为1或2时进行检查更容易阅读,然后只需查看:如果a、b或c为真,而不是a、b和c为真?这就够了。爱三元运算符+1这似乎不是一个使用三元运算符(re:readability)+1的理想场所,我也这么认为-但很高兴我不必在生产代码中阅读这段代码,它速度非常快,这段代码比任何其他解决方案都快,比投票结果最高的答案快1/6;)。我感兴趣的是它到底快了多少,归结起来是:
11.1158335579371662140028611117%
快了多少,所以即使要花上几秒钟才能弄清楚它的功能,它也比我预期的快了很多。(我已经为每种方法运行了几分钟基准测试。)+1:这是最有创意的答案!事实上,这是对这个问题的一个更好的重新表述:“检查布尔值是否同时包含真值和假值”。说真的,对于所有试图将linq用于如此简单的事情的人来说,首先,它的速度慢了15倍,其次它的可读性差得多,第三,你为什么要这样做?对于这一个,答案不起作用。。。一定是count==1 | | count==2。我想答案是什么是“最短/最好”?如果问题是关于“最快执行”,那么我同意Linq太慢了——但是如果你的“最佳”概念是,比如说,“扩展到附加参数最灵活”,那么Linq也是一个非常好的答案(IMO)。。。对于这个答案。。。你的评论是错误的-这是一个分组解决方案-因此
Count()==1
意味着只有一个组。对不起,我以为你和另一个家伙一样,但是,这不是他问的问题,他特别要求1或2是对的。不用担心-只是喜欢这个问题-我相信这会得到与你的答案相同的答案“不全是真的,也不全是假”的回答,尽管没有那么快!诚实地复制粘贴
x (){ test "$(echo $@|sed 's/ /\n/g'|sort|uniq|grep -c .)" == "2"; }
def x(a,b,c):return a!=b or b!=c