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

how to convert if-statement in to switch statement. (textbox properties)

我有一个关于 C# 编程的问题。

我正在研究如何将我的 if 语句变成 for 循环或 Switch。 P.S。我问这个的原因是因为我不知道如何制作符合此示例的 switch 语句 if Statement

 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 循环以缩短我的代码。显然我不熟悉 using for each loop 的属性。或者如果我使用 Switch case 会更好,这是我也不熟悉的。有人可以帮我用更短的代码转换我的代码吗?。提前谢谢你我的 brothers/sisters.

你不能。

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

在你的例子中,你有三个不同的表达式,没有什么可以比较的。

当然你可以把你的条件变成一个整数:

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

然后有 switch cases 0、1、2 和 3 但这绝对是不推荐并且被认为是混淆代码

否则最好集中精力重构代码:

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


编辑

整体结构建议 而不是

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

你可以这样构造它:

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

使它更清晰 and/or 更具可读性,但我认为这种变化更多的是品味问题:看看它并自己决定什么让你更快乐如果你在 4 周后阅读它

我认为 switch 不是您的最佳选择。您必须将 if 语句转换为可以在 switch 语句中使用的某种类型,例如。枚举,数字。看起来你的 SQL 语句是一样的,你不能坚持使用 2 params 查询并且如果是空的就在空字符串中传递吗?

switch 使用编译时常量值。你需要的是去掉 if branches

里面的重复代码
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;
    }
}

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

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

更新

ASh证明了我所说的。请投票给 him/her.

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;
}