Для оптимизации кода есть любой способ избежать использования нескольких операторов OR(||) в одной строке кода

Для уровня оптимизации кода существует любой способ сократить несколько строк оператора OR(||) до одной строки.

if (Convert.ToByte(hfStatus.Value) == 4 || Convert.ToByte(hfStatus.Value) == 5 || Convert.ToByte(hfStatus.Value) == 12 || Convert.ToByte(hfStatus.Value) == 11 ||Convert.ToByte(hfStatus.Value) == 3 || Convert.ToByte(hfStatus.Value) == 8 || Convert.ToByte(hfStatus.Value) == 10 || Convert.ToByte(hfStatus.Value) == 9)

Сделать шаг назад. Почему hfStatus.Value уже не сравнимо с этими цифрами? Почему его нужно конвертировать в байт? Здесь мы ничего не знаем о контексте, но очевидно, что нужно либо извлечь преобразование в байт, либо вообще избежать его. И кстати, лучший код обычно наиболее читаемый. В наши дни подсчет строк кода редко является правильным подходом к оптимизации.

Damien_The_Unbeliever 31.07.2024 07:52

@Damien_The_Unbeliever, hfstatus.value хранит значение по умолчанию, мне нужно быть байтовым значением, оно извлекает данные, хранящиеся из БД. я получил ответ, который мне нужен из ответов.

Dev 31.07.2024 08:04

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

MakePeaceGreatAgain 31.07.2024 08:38

Обратите внимание, что оптимизация читаемости и производительности — это две разные и часто противоположные цели. Если вы оптимизируете производительность, вам необходимо провести тесты для оценки любых изменений, см. тест .net.

JonasH 31.07.2024 09:57
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для этого вы можете использовать HashSet. HashSet особенно эффективен для проверки членства, поскольку обеспечивает среднюю сложность поиска O(1).

HashSet<byte> validValues = new HashSet<byte> { 4, 5, 12, 11, 3 };
if (validValues.Contains(Convert.ToByte(hfStatus.Value)))
{
    // Your code here
}

Другими вариантами могут быть использование switch statement или Array or List.

Я не уверен, что HashSet вообще хорошая идея для небольшого известного набора целых чисел размером в байт.

AKX 31.07.2024 07:54

Вы также можете использовать , Array или List

Raveena Sarda 31.07.2024 07:55

Я также предложил разные способы

Raveena Sarda 31.07.2024 07:56

HashSet вообще не лучшая идея для набора небольших чисел, подобных этому.

Yoji 31.07.2024 07:57

Массивы и списки не имеют сложности поиска O(1).

AKX 31.07.2024 07:58

вы всегда можете сделать без выделения stackalloc[] { 1, 2, 3, 4, 5, 6 }.Contains(toTest), и он будет вести себя как настоящий или, возвращающийся раньше. Или все равно N-сложность

Ivan Petrov 31.07.2024 08:43

Я попробовал несколько разных методов (Результаты тестов), и в порядке от лучшего к худшему у нас есть: статическое сравнение (ответ на сопоставление шаблона SomeBody) за 0,0457 нс, stackalloc с Contains (Иван) за 2,88 нс, кэшированная версия ваш хэш-набор Contains - 3,27 нс, цикл for массива - 5,92 нс, List.Contains - 17,3 нс, LINQ .Any массива - 37,6 нс, а ваш HashSet содержит (построение хэш-набора непосредственно перед проверкой) - 77,2 нс. Это примерно в 1700 раз медленнее, чем сопоставление с образцом, и в 13 раз медленнее, чем скромный цикл for.

ProgrammingLlama 31.07.2024 08:59

Вы можете найти мой тестовый код здесь: Pastebin.com/XrRLKfrf но суть в том, что всему есть свое место, и создание хэш-набора не является бесплатным.

ProgrammingLlama 31.07.2024 09:00

Нет веских причин, чтобы это была одна строка.

var statusByte = Convert.ToByte(hfStatus.Value);
if (
    statusByte == 3 || 
    statusByte == 4 || 
    statusByte == 5 || 
    statusByte == 8 || 
    statusByte == 9 ||
    statusByte == 10 || 
    statusByte == 11 || 
    statusByte == 12
) {
    // ...
}

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

Вы также можете добавить комментарии для различных случаев магических чисел:

if (
    statusByte == 3 ||  // Bad descriptor
    statusByte == 4 ||  // Color too orange
...
Ответ принят как подходящий

В C# 9 появился новый тип сопоставления с образцом, который может сделать код более понятным:

byte hfState = Convert.ToByte(hfStatus.Value);
if (hfstate is 4 or 5 or 12 or 11 or 3 or 8 or 10 or 9)
{
   // do something
}

Другая рекомендация — использовать константы, чтобы сделать ваш код еще более читабельным:

const byte connectionTooSlow = 4;
const byte serverNotFound = 5;
if (hfState is connectionTooSlow or serverNotFound or ...)
{
}

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