字符串中的C#多个开关案例组合

时间:2019-03-13 17:35:35

标签: c# asp.net .net switch-statement

我最近在将经典的ASP应用程序转换为C#.NET时遇到了一个相当有趣的问题。在此MVC应用程序中,前端复选框(如下所示)以字符串形式读入,可以是多种组合。 C#case语句确定正确的组合,并将case语句中的SQL语句连接到数据层文件中的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" />

4 个答案:

答案 0 :(得分:1)

尝试一下:

有多种方法可以执行此操作:ABCD组合最多可以创建15个组合。在切换的情况下,我创建了所有15种组合:

for (var i = 0; i < arrayLength; i++) {

var it = obj[i];

var  companyJson = {
    organization_name:it["Organization Name"],
    twitter:it["Twitter"],
    facebook:it["Facebook"],
    linkedin: it["Linkedin"],
};

//var myCompany = new Company(companyJson);

var query = { organization_name: it["Organization Name"] };
var options  = {upsert: true, new: true, runValidators: true};

Company.findOneAndUpdate(
        {query, // find a document with that filter
        companyJson, // document to insert when nothing was found
        options, // options
            function (err, doc) { // callback
                console.log("it worked");
                if (err) {
                    console.log("error finding and updating company", err);
                } else {
                    console.log("found and updating company");
                    // console.log("found and updating company", doc);
                }
            } // callback
        }
    );

var shit = obj[i][0];
console.log('the shit',shit);
}

答案 1 :(得分:0)

假设用户选择了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;

        }

答案 2 :(得分:0)

我假设您可能正在尝试根据选中的复选框选项构建where子句条件。在这里,如果我们尝试使用switch语句,则可能最终会为每种组合编写很多案例,而这种情况效率不高(例如-a,ab,abc,abcd,ac,acd,ad,b ,bc,bcd,bd,c,cd,d)。如果值不按顺序排列,则该组合将相乘。更糟。因此,如果将简单的条件语句与字符串生成器一起使用来保存最终字符串,则将是有益的-

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 :(得分:0)

由于您基本上是在比较布尔值,所以我建议您制作一张表来映射您拥有的不同复选框组合,以验证是否最好使用if-elses或嵌套一些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 && B;
        action_B = B || D;
        action_C = C && D;
        action_D = action_A && C;
        action_E = !A && !B && !C && D;
    }
}