我对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会更好,这是我不熟悉的。有人可以帮我转换我的代码吗?先谢谢你的兄弟姐妹们。
答案 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 但这肯定是不推荐并且被视为模糊代码
最好你专注于重构你的代码:
<小时/> 的修改
整体结构的建议 而不是
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;
}