Есть ли способ написать «и наоборот» в операторе if без повторного написания того же кода, но с «||»?
if (currentDirection == 1 && nextDirection == 2)
if ((currentDirection == 1 && nextDirection == 2) || (currentDirection == 2 && nextDirection == 1))
Например, здесь мне бы хотелось, чтобы это также было верно, если currentDirection == 2 и nextDirection == 1, но кажется, что должен быть лучший способ написания кода, чем второй способ.
Я не думаю, что это то, что означает «коммутативность». Я думаю, это означает, что вы можете поменять местами две половины одного выражения ==
и получить тот же результат...
Согласитесь, это не та коммутативность, о которой вы просите. Ваш «второй способ» написания кода хорош, и я не думаю, что вы должны «чувствовать», что он написан плохо (кстати, я вижу только один работающий способ). Возможно, вы могли бы разработать лучший способ работы с «направлениями», но это другой вопрос.
В программировании не существует понятия «лучше». Есть быстрее. Есть "более ремонтопригодный". Есть «проще проверить». Иногда получается все три в одном. Чаще всего вы получаете один или два сразу.
@HereticMonkey Я бы сказал, что «более удобный в обслуживании» часто так же скользок, как и «лучше».
@CameronLindo Нет, у тебя это лучший способ. Гораздо лучше, чем любой ответ IMO, с точки зрения удобства обслуживания/читабельности.
Для этого не существует встроенной языковой конструкции, поскольку это кажется довольно нишевым.
Однако вы можете легко создать вспомогательную функцию:
bool UnorderedEq<T>(T a1, T a2, T b1, T b2) =>
(a1, a2).Equals((b1, b2)) || (a1, a2).Equals((b2, b1));
Если вас волнует производительность, то эта версия для структур, вероятно, лучше:
bool UnorderedEq<T>(in T a1, in T a2, in T b1, in T b2) where T: struct, IEquatable<T> =>
(a1, a2).Equals((b1, b2)) || (a1, a2).Equals((b2, b1));
если и только если оба сравниваемых значения гарантированно кратны двум, вы можете сделать это с помощью прямой и быстрой побитовой операции или:
// as extension
bool static BitMatch(this int bitMask, int val1, int val2)
=> val1 != 0 && val2 != 0 && bitMask!= 0 && ((val1 | val2) == bitMask);
// call
if ((1|2).BitMatch(currentDirection, nextDirection);
Возможно, вы захотите посмотреть stackoverflow.com/questions/3907299/…