Коммутативность C# в операторах if

Есть ли способ написать «и наоборот» в операторе if без повторного написания того же кода, но с «||»?

if (currentDirection == 1 && nextDirection == 2)
if ((currentDirection == 1 && nextDirection == 2) || (currentDirection == 2 && nextDirection == 1))

Например, здесь мне бы хотелось, чтобы это также было верно, если currentDirection == 2 и nextDirection == 1, но кажется, что должен быть лучший способ написания кода, чем второй способ.

Возможно, вы захотите посмотреть stackoverflow.com/questions/3907299/…

Progman 09.10.2023 21:39

Я не думаю, что это то, что означает «коммутативность». Я думаю, это означает, что вы можете поменять местами две половины одного выражения == и получить тот же результат...

Heretic Monkey 09.10.2023 21:43

Согласитесь, это не та коммутативность, о которой вы просите. Ваш «второй способ» написания кода хорош, и я не думаю, что вы должны «чувствовать», что он написан плохо (кстати, я вижу только один работающий способ). Возможно, вы могли бы разработать лучший способ работы с «направлениями», но это другой вопрос.

topsail 09.10.2023 21:53

В программировании не существует понятия «лучше». Есть быстрее. Есть "более ремонтопригодный". Есть «проще проверить». Иногда получается все три в одном. Чаще всего вы получаете один или два сразу.

Heretic Monkey 09.10.2023 22:02

@HereticMonkey Я бы сказал, что «более удобный в обслуживании» часто так же скользок, как и «лучше».

TylerH 10.10.2023 16:58

@CameronLindo Нет, у тебя это лучший способ. Гораздо лучше, чем любой ответ IMO, с точки зрения удобства обслуживания/читабельности.

TylerH 10.10.2023 16:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для этого не существует встроенной языковой конструкции, поскольку это кажется довольно нишевым.

Однако вы можете легко создать вспомогательную функцию:

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);

Другие вопросы по теме

Каков самый быстрый способ R для генерации случайных переменных распределения Бейтса?
Какова функция стоимости для этого алгоритма?
Есть ли простой способ построить эффективную границу с помощью R?
Как сделать вложенный цикл for в R более эффективным для записи вывода в фрейм данных?
Как повысить производительность при случайном выборе кластеров и добавлении наблюдений?
Как я могу сгенерировать простые палиндромы в заданном диапазоне без полного поиска и использования функции проверки?
Как я могу сделать свою рекурсивную программу для вывода факториала числа более эффективной?
Есть ли способ оптимизировать скорость изменения значений в фрейме данных с> 2 миллионами строк?
Лучший способ создать цикл для умножения матрицы на каждый из ее элементов, а затем суммирования результатов
Как я могу написать этот рабочий код для повышения производительности?