C # несколько комбинаций регистров переключения в строке

#c# #asp.net #.net #switch-statement

#c# #asp.net #.net #оператор переключения

Вопрос:

Недавно я столкнулся с довольно интересной проблемой при преобразовании классического приложения ASP в C # .NET. В этом приложении MVC флажки внешнего интерфейса (ниже) считываются как строка, которая может быть в нескольких комбинациях. Оператор C # case определяет правильную комбинацию и объединяет оператор SQL в операторе case с параметром SELECT в файле уровня данных.

 <input value="A" type="checkbox" class="material-checkbox" 
id="" name="checkbox" checked />
<input value="B" type="checkbox" class="material-checkbox" 
id="" name="checkbox" />
<input value="C" type="checkbox" class="material-checkbox" 
id="" name="checkbox" />
<input value="D" type="checkbox" class="material-checkbox" 
id="" name="checkbox" />
  

Комментарии:

1. не могли бы вы, пожалуйста, рассказать еще немного о вашем четырех флажках и их значениях, а также о некоторых примерах данных для случая переключения.

2. Извините, я совсем не понимаю. Вам нужно будет конкретизировать этот вопрос и предоставить информацию в формате what, чтобы кто-то, кто смотрит на это со стороны, мог понять, о чем вы говорите. Например, что означает «C # определяет, какие операторы будут добавлены в SELECT» . Что SQL; делает / означает? Зачем вам вообще понадобилось иметь более одного case "A": предложения в операторе switch (второе никогда бы не выполнилось)?

3. Как ваш второй case "A": может выдавать ошибку — он не компилируется.

Ответ №1:

Попробуйте это:

существует несколько способов сделать это: комбинация ABCD может создать всего 15 комбинаций. Я создал все 15 комбинаций в случаях переключения:

 string checkboxvalue = "";
if(chkA.Checked()) checkboxvalue  ="A";
if(chkB.Checked()) checkboxvalue  ="B";
if(chkC.Checked()) checkboxvalue  ="C";
if(chkD.Checked()) checkboxvalue  ="D";



switch(checkboxvalue)
    {
        case "ABCD":
        strSql  = "AND .....;"
        break;

        case "ABC":
        strSql  = "AND .....;"
        break;

        case "ABD":
        strSql  = "AND .....;"
        break;

        case "ACD":
        strSql  = "AND .....;"
        break;

        case "BCD":
        strSql  = "AND .....;"
        break;

        case "AB":
        strSql  = "AND .....;"
        break;

        case "AC":
        strSql  = "AND .....;"
        break;

        case "AD":
        strSql  = "AND .....;"
        break;

        case "BC":
        strSql  = "AND .....;"
        break;

        case "BD":
        strSql  = "AND .....;"
        break;

        case "CD":
        strSql  = "AND .....;"
        break;

        case "A":
        strSql  = "AND .....;"
        break;

        case "B":
        strSql  = "AND .....;"
        break;

        case "C":
        strSql  = "AND .....;"
        break;

        case "D":
        strSql  = "AND .....;"
        break;
    }
  

Ответ №2:

Я предполагаю, что вы, вероятно, пытаетесь создать условия предложения where на основе установленных флажков. Здесь, если мы попытаемся использовать оператор switch, мы, вероятно, в конечном итоге напишем множество регистров для каждой комбинации, что было бы неэффективно (что-то вроде — a, ab, abc, abcd, ac, acd, ad, b, bc, bcd, bd, c, cd, d). Если значения не расположены по порядку, эта комбинация будет умножаться. Еще хуже. Итак, будет полезно использовать простые условные операторы if с построителем строк для хранения конечной строки примерно так, как показано ниже —

 StringBuilder sb = new StringBuilder();
if (checkbox1.checked)
{
    sb.Apppend("Condition1");
}

if (checkbox2.checked)
{
    sb.Apppend("Condition2");
}

if (checkbox3.checked)
{
    sb.Apppend("Condition3");
}

if (checkbox4.checked)
{
    sb.Apppend("Condition4");
}
  

Ответ №3:

Предполагая, что пользователь выбрал поля A, C, D.

 strSql  = "SELECT column1, column2, ...
      FROM table_name;"


     switch(checkboxvalue)
        {
        case (("ABCD")): //<---Contains "ACD" but not "B" NO MATCH
        strSql  = "AND .....;"
        break;

        case (("ABC")): //<---- Contains "A" but not "BC" NO MATCH
        strSql  = "AND.......;"
        break;

        case (("AB")): //<--Contains "A" but no "B" NO MATCH
        strSql  = "AND......;"
        break; 

        case (("AC")): //<--Contains "AC" but no "D" NO MATCH
        strSql  = "AND.....";
        break;

        case (("ACD")): //<--MATCH! 
        strSql  = "AND......"; //<--add to select to pull correct data 
        break;

        }
  

Комментарии:

1. Я не понимаю. Откуда берется «ACD». Что SQL; делает / означает? И, если вы собираетесь публиковать код, можете ли вы сделать его компилируемым (т. Е. поставить // перед своими <--Contains комментариями). Что это за странные двойные скобки вокруг case строк. Являются ли они значимыми (я понимаю, что возможности switch оператора недавно изменились, но чем (("ABCD")) это отличается от обычного старого "ABCD"

2. Двойные скобки просто для удобства чтения. Вы можете просто вставить «ABCD», полностью опустив их. SQL; обозначает оператор sql внутри оператора case, как я предварял в своей первоначальной части вопроса. Преобразование классического ASP в ASP. NET непросто для тех из нас, кто в этом новичок, и, похоже, это может быть довольно распространенной проблемой. Просто делаю все возможное, чтобы помочь какому-нибудь другому программисту, возможно. Спасибо за комментарий!

Ответ №4:

Поскольку вы в основном сравниваете логические значения, я бы предложил создать таблицу для сопоставления различных комбинаций флажков, которые у вас будут, чтобы проверить, будет ли вам лучше использовать if-else или несколько вложенных if вместо переключателей. Попробуйте пересчитать, сколько выходных данных у вас будет и какие действия вам нужно будет выполнить в таких случаях.

 static void executeSQL(string checkboxes)
{
    switches checkbox_switches = new switches(checkboxes.Contains('A'), checkboxes.Contains('B'), checkboxes.Contains('C'), checkboxes.Contains('D'));
    if (checkbox_switches.action_A)
    {
        //Execute SQL
    }
    else if (checkbox_switches.action_B)
    {
        //Execute SQL
    }
    else if (checkbox_switches.action_C)
    {
        //Execute SQL
    }
    else if (checkbox_switches.action_D)
    {
        //Execute SQL
    }
    else if (checkbox_switches.action_E)
    {
        //Execute SQL
    }
}

struct switches
{
    public bool action_A, action_B, action_C, action_D, action_E;

    public switches(bool A, bool B, bool C, bool D)
    {
        action_A = A amp;amp; B;
        action_B = B || D;
        action_C = C amp;amp; D;
        action_D = action_A amp;amp; C;
        action_E = !A amp;amp; !B amp;amp; !C amp;amp; D;
    }
}