Для уровня оптимизации кода существует любой способ сократить несколько строк оператора 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)
@Damien_The_Unbeliever, hfstatus.value хранит значение по умолчанию, мне нужно быть байтовым значением, оно извлекает данные, хранящиеся из БД. я получил ответ, который мне нужен из ответов.
Не совсем понятно, что вы здесь хотите оптимизировать. Вышеупомянутый код буквально состоит из одной строки, так что же именно вам здесь нужно?
Обратите внимание, что оптимизация читаемости и производительности — это две разные и часто противоположные цели. Если вы оптимизируете производительность, вам необходимо провести тесты для оценки любых изменений, см. тест .net.
Для этого вы можете использовать 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 вообще хорошая идея для небольшого известного набора целых чисел размером в байт.
Вы также можете использовать , Array или List
Я также предложил разные способы
HashSet вообще не лучшая идея для набора небольших чисел, подобных этому.
Массивы и списки не имеют сложности поиска O(1).
вы всегда можете сделать без выделения stackalloc[] { 1, 2, 3, 4, 5, 6 }.Contains(toTest)
, и он будет вести себя как настоящий или, возвращающийся раньше. Или все равно N-сложность
Я попробовал несколько разных методов (Результаты тестов), и в порядке от лучшего к худшему у нас есть: статическое сравнение (ответ на сопоставление шаблона 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.
Вы можете найти мой тестовый код здесь: Pastebin.com/XrRLKfrf но суть в том, что всему есть свое место, и создание хэш-набора не является бесплатным.
Нет веских причин, чтобы это была одна строка.
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 ...)
{
}
Сделать шаг назад. Почему
hfStatus.Value
уже не сравнимо с этими цифрами? Почему его нужно конвертировать в байт? Здесь мы ничего не знаем о контексте, но очевидно, что нужно либо извлечь преобразование в байт, либо вообще избежать его. И кстати, лучший код обычно наиболее читаемый. В наши дни подсчет строк кода редко является правильным подходом к оптимизации.