Рейтинг:
26
OriginalGriff
если вам нужны только строки, то один из способов сделать это-настроить массив и уменьшить каждое условие if до одного бита в целочисленном виде.
int index = 0;
if (a > 0) index |= 1;
if (b > 0) index |= 2;
if (c > 0) index |= 4;
Затем можно настроить массив строк, относящихся к значению индекса:
string[] selects = new string[] { "Select * FROM none",
"Select * FROM a only",
"Select * FROM b only",
"Select * FROM a and b",
"Select * FROM c only",
"Select * FROM a and c",
"Select * FROM b and c",
"Select * FROM a, b, and c"};
И выберите свою строку напрямую.
Sigmond Gatt
тогда я могу позвонить select[index] , верно ?
OriginalGriff
Именно так!
Sigmond Gatt
но проблема в том, что у меня будет такое же количество утверждений if, есть способ, которым я могу их уменьшить, пожалуйста ?
OriginalGriff
Нет, вся идея в том, что ты этого не делаешь. В приведенном мною примере у вас есть три оператора if, и он выбирает из восьми строк (здесь идет речь о базовом двоичном коде). Вы сказали, что у вас есть пять условий, которые объединены: это то, что делает двоичное значение или значение индекса: если a и b истинны, индекс содержит три (1/2 == 3)
У вас есть пять условий, которые дают вам 32 варианта, но только пять операторов if.
Sigmond Gatt
Вау, это кажется интересным. Я буду вдаваться в более подробно об этом. спасибо :)
OriginalGriff
Всегда пожалуйста!
Ziee-M
Я бы все делал немного по-другому.
-1 - я создаю таблицу, которая содержит все возможные ответы, я думаю об этих условиях как о правилах, которые могут меняться/обновляться с течением времени. установка их в таблице, чтобы разрешить обновление пользователей, кажется мне хорошей идеей.
-2 - Подобно OriginalGriff, я бы сгенерировал двоичный файл 5 (00000->11111) и в зависимости от значения использовал бы свою таблицу базы данных и получал бы строку.
-3 - результатом должна быть только одна строка кода, так как все ваши правила находятся на уровне базы данных
OriginalGriff
Использование базы данных-неплохая идея, но в данном случае это немного опасно.
Помните, что он разрабатывает, какую команду SQL SELECT выполнить, поэтому к системам, которые легче изменить эту команду и заставить ее выполняться в других системах, следует относиться с осторожностью. Модифицировать исходный код сложно - количество людей, которые имеют доступ к исходному коду и компилятору и могут выдавать исправленную версию всем клиентам, вероятно, довольно мало. Но число людей, которые могут изменять строковые значения в базе данных, как правило, намного больше. Так что точно так же как SQL инъекция это не займет много времени чтобы добавить код вы будете выполнены позже почти без следа:
Обновление зарплаты SET HourlyRate = HourlyRate + 1, где EmpID = 666; выберите * из таблицы 1
В одной записи, которая используется только в конкретном случае, и удалите ее через месяц или два, и ее будет практически невозможно отследить, если вы действительно не знаете, где искать и как. Вы должны быть осторожны с этими вещами!
Ziee-M
Действительно, ваше объяснение имеет большой смысл в данном конкретном случае, thx для того, чтобы указать на него.
OriginalGriff
Всегда пожалуйста!
Рейтинг:
2
Patrice T
Цитата:
теперь они могут быть объединены, поэтому мне нужно сделать много операторов if ( факториал из 5 (120 операторов if))
Нет, у вас есть 5 двоичных условий, это делает 2^5= 32 возможности.
Вам нужно узнать, что C чувствителен к регистру, это означает, что:
"это" - правильно, "это" - нет.
"если" - правильно, "если" - нет.
"иначе" - это правильно, "иначе" - нет.
sql = "SELECT * FROM TABLE1"; // is correct
sql = "SELECT * FROM TABLE1; // is not
if (THIS.TESTCASE2 > 0) {...}
else if (THIS.TESTCASE2 < 0) {...}
Этот код пропускает случай (THIS.TESTCASE2 == 0), который не обрабатывается.