Код, который возвращает True, если только один или два из трех параметров верны - PullRequest
12 голосов
/ 17 марта 2011

Мне нужен код, который возвращает True, если только один или два из трех параметров верны

какой самый короткий / лучший способ?

Ответы [ 15 ]

23 голосов
/ 17 марта 2011

Я зависим от этого вопроса!

bool MyFourthAnswer(bool a, bool b, bool c)
{
   return (a != b) || (b != c);
}
14 голосов
/ 17 марта 2011

Просто проверьте, установлено ли хотя бы одно из значений и , не установлены ли все три значения:

bool result = (a | b | c) & !(a & b & c);
10 голосов
/ 17 марта 2011

Вот причудливый способ:

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

Если установлен первый тип bool, любой из оставшихся должен быть сброшен.В противном случае должен быть установлен любой из оставшихся.

РЕДАКТИРОВАТЬ- В ответ на комментарии: в рабочем коде я бы, вероятно, пошел с @ AS-CII или @Stuart;он сообщает цель того, что вычисляется наиболее четко.

5 голосов
/ 17 марта 2011

Еще один ответ ... Мне нравится этот вопрос ...

bool MyThirdAnswer(params bool[] list)
{
   return list.Distinct().Count() == 2;
}
5 голосов
/ 17 марта 2011

Это должно сделать это

return !((a & b & c) || (!a & !b & !c))
4 голосов
/ 18 марта 2011

Окончательный ответ от меня ... честно!

Один вопрос, который возник у меня, заключается в том, действительно ли это ситуация, когда следует использовать 3 bools.

Вместо использования 3 bools,было бы более целесообразно использовать перечисление [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;
   }
}

OutИнтересно, что такое 3 bools в первоначальном вопросе?

4 голосов
/ 17 марта 2011

LINQ way:

bool[] params = { true, false, true };
int count = params.Count(a => a);
bool result = count == 2 || count == 1;
3 голосов
/ 18 марта 2011

Просто для удовольствия, если true = 1 и false = 0:

return (a + b + c) % 3

И еще один, предполагая, что false = 0 и true = любое строго положительное целое число:

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

Зачем придерживаться пары сравнений / логических операций, когда вы можете сделать 6 умножений и сделать их полностью неясными? ; -)

2 голосов
/ 20 марта 2011

Это такой забавный вопрос - мне пришлось попробовать его в Clojure (язык, который я изучаю)

2 голосов
/ 17 марта 2011
bool MyAnswer(params bool[] list)
{
   var countTrue = list.Where(x => x).Count();
   return countTrue == 1 || countTrue == 2;
}

Редактировать: после избиения комментаторами true == x удалено ... извините - это было в документе "Стандарты кодирования", которому я должен был следовать один раз!

...