如何将 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;
}
我有一个关于 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;
}