A или B, не оба, не ни один

Начиная с чтения Чистого Кода я пытался сохранить свой код описательным и легким понять. У меня есть условие, где или A или B должны быть заполнены в. Но не оба. И не ни один. В настоящее время if за оператором для проверки на это условие трудно следовать сразу. Как был бы Вы писать следующее для прояснения сразу, что проверяется

if ((!string.IsNullOrEmpty(input.A) && !string.IsNullOrEmpty(input.B)) 
    || string.IsNullOrEmpty(input.A) && string.IsNullOrEmpty(input.B))
{
    throw new ArgumentException("Exactly one A *OR* B is required.");
}
9
задан Pretzel 12 July 2010 в 13:54
поделиться

8 ответов

Время для XOR:

if(!(string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)))
    throw new ArgumentException("Exactly one A *OR* B is required.");

Вы также можете увидеть, что это написано как:

if(!(string.IsNullOrEmpty(input.A) ^ string.IsNullOrEmpty(input.B)))
    throw new ArgumentException("Exactly one A *OR* B is required.");
24
ответ дан 4 December 2019 в 05:55
поделиться

то, что вы ищете - это логика XOR ( http://en.wikipedia.org/wiki/Exclusive_or ).

Вы можете записать ее так:

if (string.IsNullOrEmpty(A) ^ string.IsNullOrEmpty(B))
{
//Either one or the other is true
}
else
{
//Both are true or both are false
}
2
ответ дан 4 December 2019 в 05:55
поделиться
if (string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)) {
 // do stuff
}
13
ответ дан 4 December 2019 в 05:55
поделиться

То, что вам нужно, называется XOR, то есть операция исключающее ИЛИ .

Таблица истинности откроет вам это ;)

A   B   ⊕
F   F   F
F   T   T
T   F   T
T   T   F

В некоторых языках (или в большинстве из них) она обозначается A ^ B .

хорошая статья в вики

1
ответ дан 4 December 2019 в 05:55
поделиться

Это самое определение исключающего или. Есть куча способов с помощью булевой алгебры, самый простой - использовать оператор XOR. В C нет логического xor, но вы можете использовать двоичный оператор one, удваивающий оператор not, чтобы заставить любое истинностное значение быть единицей (как в 0x01)

!!string.IsNullOrEmpty(input.A) ^ !!string.IsNullOrEmpty(input.B)

Или сделать отрицательный тест

!string.IsNullOrEmpty(input.A) ^ !string.IsNullOrEmpty(input.B)

который будет истинным, если и A и B установлены, или ни то, ни другое.

0
ответ дан 4 December 2019 в 05:55
поделиться

Использовать исключающее ИЛИ : A XOR B

3
ответ дан 4 December 2019 в 05:55
поделиться

Это отношение называется исключающее-или (xor).

Некоторые языки предоставляют его в виде оператора - обычно ^:

True ^ True -> False
True ^ False -> True
False ^ True -> True
False ^ False -> False
6
ответ дан 4 December 2019 в 05:55
поделиться

Это XOR, и его очень легко подражать.

Просто вдумайтесь:

Оба не могут быть истинными, оба не могут быть ложными. Один должен быть правдой, другой должен быть ложным.

Итак, мы приходим к следующему:

if(string.IsNullOrEmpty(input.A) == string.IsNullOrEmpty(input.B)) {
   throw new ArgumentException("Exactly one A *OR* B is required.");
}

Если оба равны, они либо оба истинны, либо оба ложны. И оба случая недействительны.

И все это без какого-либо специального оператора XOR, которого может не быть в выбранном языке. ;)

12
ответ дан 4 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: