如何将if语句转换为switch语句。 (文本框属性)

时间:2015-02-05 07:34:37

标签: c# relational-database

我对C#编程有疑问。

我正在研究如何将if语句转换为for循环或Switch。 附:我问这个的原因是因为我不知道如果使用Statement

制作符合此示例的switch语句
 if (!string.IsNullOrEmpty(cmbDivision.Text) &
                (string.IsNullOrEmpty(tbEnduser.Text)))
            {
                cmd.CommandText = @"select a.*, c.Enduser          
                            from matt.ServiceInfo a
                            left join matt.Divisions b
                            on
                            a.DivisionCode = b.DivisionCode
                            left join matt.EmployeeInfo c
                            on a.DivisionCode = c.DivisionCode
                            where b.DivisionCode like @Division";
                cmd.Parameters.AddWithValue("@Division", cmbDivision.Text + '%');


                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    DataTable dt = new DataTable();
                    btnEdit.Visible = true;
                    da.Fill(dt);
                    dgvRptView.DataSource = dt;

            }

这是完整的代码段

public void btnSearch_Click(object sender, EventArgs e)
    {
        using (var cmdconn = new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ConnectionString)) 
        {

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cmdconn;

            if (!string.IsNullOrEmpty(cmbDivision.Text) &
                (string.IsNullOrEmpty(tbEnduser.Text)))
            {
                cmd.CommandText = @"select a.*, c.Enduser          
                            from matt.ServiceInfo a
                            left join matt.Divisions b
                            on
                            a.DivisionCode = b.DivisionCode
                            left join matt.EmployeeInfo c
                            on a.DivisionCode = c.DivisionCode
                            where b.DivisionCode like @Division";
                cmd.Parameters.AddWithValue("@Division", cmbDivision.Text + '%');


                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    DataTable dt = new DataTable();
                    btnEdit.Visible = true;
                    da.Fill(dt);
                    dgvRptView.DataSource = dt;

            }
            else if (!string.IsNullOrEmpty(tbEnduser.Text) &
                    (string.IsNullOrEmpty(cmbDivision.Text)))
            {
                cmd.CommandText = @"select a.*, c.Enduser          
                            from matt.ServiceInfo a
                            left join matt.Divisions b
                            on
                            a.DivisionCode = b.DivisionCode
                            left join matt.EmployeeInfo c
                            on a.DivisionCode = c.DivisionCode
                            where c.Enduser like @Enduser";
                cmd.Parameters.AddWithValue("@Enduser", tbEnduser.Text + '%');

                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                DataTable dt = new DataTable();
                da.Fill(dt);

                dgvRptView.DataSource = dt;

            }
            else if (!string.IsNullOrEmpty(tbEnduser.Text) &
                    (!string.IsNullOrEmpty(cmbDivision.Text)))
            {
                cmd.CommandText = @"select a.*
                from matt.ServiceInfo a
                left join matt.Divisions b
                on a.DivisionCode = b.DivisionCode
                where b.DivisionCode like @Division";
                cmd.Parameters.AddWithValue("@Enduser", tbEnduser.Text + '%');
                cmd.Parameters.AddWithValue("@cmbDivison", cmbDivision.Text + '%');
                btnEdit.Visible = true;
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                DataTable dt = new DataTable();
                da.Fill(dt);

                dgvRptView.DataSource = dt;

            }
            else
            {
                MessageBox.Show("Please fill the following fields");
            }
        }

    }

我的代码似乎工作正常,事情是,我想增强我的编码, 所以我决定将其转换为for循环来缩短我的代码。显然我不熟悉每个循环使用的属性。或者如果我使用Switch case会更好,这是我不熟悉的。有人可以帮我转换我的代码吗?先谢谢你的兄弟姐妹们。

5 个答案:

答案 0 :(得分:3)

使用编译时常量值切换工作。你需要的是摆脱分支中的重复代码

public void btnSearch_Click(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(tbEnduser.Text) && string.IsNullOrEmpty(cmbDivision.Text))
    {
        MessageBox.Show("Please fill the following fields");
        return;
    }
    using (var cmdconn = new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ConnectionString)) 
    {

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cmdconn;
        string text = @"select a.*, c.Enduser          
                        from matt.ServiceInfo a
                        left join matt.Divisions b
                        on
                        a.DivisionCode = b.DivisionCode
                        left join matt.EmployeeInfo c
                        on a.DivisionCode = c.DivisionCode";

        if (!string.IsNullOrEmpty(tbEnduser.Text) &
                (!string.IsNullOrEmpty(cmbDivision.Text)))
        {
            text += " where b.DivisionCode like @Division and c.Enduser like @Enduser";
            cmd.Parameters.AddWithValue("@Enduser", tbEnduser.Text + '%');
            cmd.Parameters.AddWithValue("@cmbDivison", cmbDivision.Text + '%');
            btnEdit.Visible = true;
        }
        else if (!string.IsNullOrEmpty(cmbDivision.Text) &
            (string.IsNullOrEmpty(tbEnduser.Text)))
        {
            text += " where b.DivisionCode like @Division";
            cmd.Parameters.AddWithValue("@Division", cmbDivision.Text + '%');
        }
        else if (!string.IsNullOrEmpty(tbEnduser.Text) &
                (string.IsNullOrEmpty(cmbDivision.Text)))
        {
            text+=" where c.Enduser like @Enduser";
            cmd.Parameters.AddWithValue("@Enduser", tbEnduser.Text + '%');
        }

        cmd.CommandText = text;
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = cmd;
        DataTable dt = new DataTable();
        da.Fill(dt);

        dgvRptView.DataSource = dt;
    }
}

答案 1 :(得分:1)

你不能。

switch语句需要一个表达式,该表达式与单个值列表(枚举,整数,字符串)进行比较。

在您的情况下,您有三种不同的表达方式,无需进行比较。

当然你可以把你的病情变成一个int:

int conditionInt = 
    string.IsNullOrEmpty(cmbDivision.Text) ? 1 : 0
    +
    string.IsNullOrEmpty(cmbDivision.Text) ? 2 : 0

然后让开关盒为0,1,2和3 但这肯定是不推荐并且被视为模糊代码

最好你专注于重构你的代码:

  • 避免重复代码,将其放入方法中。
  • 使用参数化的sql

<小时/> 的修改

整体结构的建议 而不是

if(!empty1 && !empty2)
else if(!empty1 && empty2)
...

你可以像这样结构:

if(!empty1)
{
    if(!empty2)
    {
    }
    else // empty2
    {
    }
}
else // empty1
{
    if(!empty2)
    {
    }
    else // empty2
    {
    }
} 

使更清晰和/或更具可读性,但我认为这种变化更多的是品味:看看它并自己决定如果你在4周后阅读它会让你更开心

答案 2 :(得分:1)

我不认为在您的情况下,切换将是最佳选择。您必须将if语句转换为可在switch语句中使用的某种类型,例如。枚举,数量。看起来你的SQL语句是相同的,你不能坚持使用2个参数查询,如果是空的话只是在空字符串内部传递?

答案 3 :(得分:1)

switch语句仅在测试表达式的各种值时使用。这在你的情况下是不合适的,因为要测试多个表达式;所以if是正确的风格。

但是,我只会在if语句中执行SQL命令创建和参数绑定。将SqlDataApator放在所有if语句之后。

<强>更新

ASh已经证明了我说的话。请投票给他/她。

答案 4 :(得分:1)

switch声明在这里并不是一个更好的选择。但是你可以重构你构建sql命令的方式:

var connStr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString);
using (var cmdconn = new SqlConnection(connStr)) 
using (var cmd = new SqlCommand())
{
    cmd.Connection = cmdconn;
    var conditions = new List<string>();
    if (!string.IsNullOrEmpty(cmbDivision.Text))
    {
        conditions.Add("b.DivisionCode like @Division");
        cmd.Parameters.AddWithValue("@Division", cmbDivision.Text + '%');
    }
    if (!string.IsNullOrEmpty(tbEnduser.Text))
    {
        conditions.Add("c.Enduser like @Enduser");
        cmd.Parameters.AddWithValue("@Enduser", tbEnduser.Text + '%');
    }

    var sql = @"select a.*, c.Enduser          
              from matt.ServiceInfo a
              left join matt.Divisions b on a.DivisionCode = b.DivisionCode
              left join matt.EmployeeInfo c on a.DivisionCode = c.DivisionCode
              where " + string.Join(" and ", conditions);

    cmd.CommandText = sql;
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;
    DataTable dt = new DataTable();
    btnEdit.Visible = true;
    da.Fill(dt);
    dgvRptView.DataSource = dt;
}