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

时间:2011-03-17 18:49:32

标签: c# .net programming-languages

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

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

15 个答案:

答案 0 :(得分:23)

我沉迷于这个问题!

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

答案 1 :(得分:14)

只需检查是否至少设置了其中一个值,而不是设置了所有三个值:

bool result = (a | b | c) & !(a & b & c);

答案 2 :(得分:10)

这是一种奇特的方式:

bool oneOrTwoTrue = a ? (!b || !c) : (b || c);

如果设置了第一个bool,则应该取消其中任何一个。否则,应设置剩下的任何一个。

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

答案 3 :(得分:5)

这应该这样做

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

LINQ方式:

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

答案 6 :(得分:4)

我的最终答案......诚实!

我想到的一个问题是,这是否真的应该使用3个bool。

使用[Flags]枚举可能更合适,而不是使用3个bool - 它可能会使代码更快,更易读,更实用。

这个代码可能是:

[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个bool是什么?

答案 7 :(得分:3)

只是为了好玩,如果true = 1且false = 0:

return (a + b + c) % 3

另一个,假设false = 0且true =任何严格正整数:

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

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

答案 8 :(得分:2)

bool MyAnswer(params bool[] list)
{
   var countTrue = list.Where(x => x).Count();
   return countTrue == 1 || countTrue == 2;
}
经过评论者true == x删除后,

编辑:删除了...抱歉 - 这是我必须遵循的“编码标准”文档!

答案 9 :(得分:2)

这是一个非常有趣的问题 - 我必须在Clojure(我正在学习的语言)中尝试它

(defn one-or-two-args-true? [& args]
      (> 3 (count (filter true? args)) 0))


user=> (one-or-two-args-true? false false false)
false
user=> (one-or-two-args-true? false false true)
true
user=> (one-or-two-args-true? false true true)
true
user=> (one-or-two-args-true? true true true)
false

答案 10 :(得分:1)

由于我之前的回答太长,我会再试一次:

bool MySecondAnswer(params bool[] list)
{
   return list.GroupBy(x => x).Count() == 2;
}

答案 11 :(得分:0)

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

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

return count == 1 || count == 2;

答案 12 :(得分:0)

bool result = !(a && b && c) && (a || b || c)

答案 13 :(得分:0)

好问题
我的回答:

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

答案 14 :(得分:0)

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