如何在 C# 中切换大小写许多变量(检查值是否为 null 或空)以替换 if-else-if 链
How to Switch-Case many variables in C# (that checks if the values are null or empty) to replace if-else-if chain
如何在 C# 中切换大小写许多变量(检查值是否为 null 或空)以替换巨大的 if-else-if 链 (+20 else-ifs)。我怎样才能用 Switch 语句替换我的代码更高效的代码:
con.Open();
SqlCommand cmd = new SqlCommand("usp_AddPublisher", con);
cmd.CommandText = "usp_AddPublisher";
cmd.CommandType = CommandType.StoredProcedure;
if (String.IsNullOrEmpty(data.Account_Num))
{
cmd.Parameters.AddWithValue("@AccountNum", "");
}
else
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num);
if (String.IsNullOrEmpty(data.publisher))
{
cmd.Parameters.AddWithValue("@publisher", "");
}
else
cmd.Parameters.AddWithValue("@publisher", data.publisher);
if (String.IsNullOrEmpty(data.addr1))
{
cmd.Parameters.AddWithValue("@addr1", "");
}
else
cmd.Parameters.AddWithValue("@addr1", data.addr1);
我试过了但是太长了:
con.Open();
SqlCommand cmd = new SqlCommand("usp_AddPublisher", con);
cmd.CommandText = "usp_AddPublisher";
cmd.CommandType = CommandType.StoredProcedure;
switch (String.IsNullOrEmpty(data.Account_Num))
{
case true:
cmd.Parameters.AddWithValue("@AccountNum", "");
break;
case false:
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num);
break;
}
switch (String.IsNullOrEmpty(data.publisher))
{
case true:
cmd.Parameters.AddWithValue("@publisher", "");
break;
case false:
cmd.Parameters.AddWithValue("@publisher", data.publisher);
break;
}
switch (String.IsNullOrEmpty(data.addr1))
{
case true:
cmd.Parameters.AddWithValue("@addr1", "");
break;
case false:
cmd.Parameters.AddWithValue("@addr1", data.addr1);
break;
}
鉴于您所做的只是在字符串为 null 或空时使用 ""
作为值,您只是将 null
合并为 ""
。所以就这样做吧:
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num ?? "")
如果您之前没有遇到过空合并运算符 ??
,您可以阅读它 in the documentation。
为此,您可以像这样使用 conditional operator ?:
:
cmd.Parameters.AddWithValue("@AccountNum", String.IsNullOrEmpty(data.Account_Num) ? "" : data.Account_Num);
或者 - 就像 Charles Mager 已经说过的(并且更具可读性) - null-coalescing operator ??
运算符是这样的:
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num ?? "");
你可以试试这个
cmd.Parameters.AddWithValue("@addr1", string.IsNullOrEmpty(data.addr1) ? "" : data.addr1);
或者更好的是,您可以创建一个扩展方法,当字符串不为 null 或空时,它将 return 字符串的值,否则它将 return 一个空字符串。
使用局部函数(C#7/VS 2017):
void TheOuterFunction()
{
// your cmd is set up here
var cmd = ...;
...;
AddParameter("@AccountNum", data.Account_Num);
AddParameter("@publisher", data.publisher);
...;
void AddParameter(string name, string value)
{
if (String.IsNullOrEmpty(value))
{
cmd.Parameters.AddWithValue(name, "");
}
else
{
cmd.Parameters.AddWithValue(name, value);
}
}
}
这使涉及的逻辑清晰可见,并减少了每个需要逻辑的参数的 "overhead"。
使用单独的函数:
public void SomeFunction()
{
con.Open();
SqlCommand cmd = new SqlCommand("usp_AddPublisher", con);
cmd.CommandText = "usp_AddPublisher";
cmd.CommandType = CommandType.StoredProcedure;
SwitchFunction(data.Account_Num, "@AccountNum", cmd);
SwitchFunction(data.publisher, "@publisher", cmd);
SwitchFunction(data.addr1, "@addr1", cmd);
}
public void SwitchFunction(string testVar, string withVal, SqlCommand cmd)
{
switch (String.IsNullOrEmpty(testVar))
{
case true:
cmd.Parameters.AddWithValue(withVal, string.Empty);
break;
case false:
cmd.Parameters.AddWithValue(withVal, testVar);
break;
}
}
如何在 C# 中切换大小写许多变量(检查值是否为 null 或空)以替换巨大的 if-else-if 链 (+20 else-ifs)。我怎样才能用 Switch 语句替换我的代码更高效的代码:
con.Open();
SqlCommand cmd = new SqlCommand("usp_AddPublisher", con);
cmd.CommandText = "usp_AddPublisher";
cmd.CommandType = CommandType.StoredProcedure;
if (String.IsNullOrEmpty(data.Account_Num))
{
cmd.Parameters.AddWithValue("@AccountNum", "");
}
else
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num);
if (String.IsNullOrEmpty(data.publisher))
{
cmd.Parameters.AddWithValue("@publisher", "");
}
else
cmd.Parameters.AddWithValue("@publisher", data.publisher);
if (String.IsNullOrEmpty(data.addr1))
{
cmd.Parameters.AddWithValue("@addr1", "");
}
else
cmd.Parameters.AddWithValue("@addr1", data.addr1);
我试过了但是太长了:
con.Open();
SqlCommand cmd = new SqlCommand("usp_AddPublisher", con);
cmd.CommandText = "usp_AddPublisher";
cmd.CommandType = CommandType.StoredProcedure;
switch (String.IsNullOrEmpty(data.Account_Num))
{
case true:
cmd.Parameters.AddWithValue("@AccountNum", "");
break;
case false:
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num);
break;
}
switch (String.IsNullOrEmpty(data.publisher))
{
case true:
cmd.Parameters.AddWithValue("@publisher", "");
break;
case false:
cmd.Parameters.AddWithValue("@publisher", data.publisher);
break;
}
switch (String.IsNullOrEmpty(data.addr1))
{
case true:
cmd.Parameters.AddWithValue("@addr1", "");
break;
case false:
cmd.Parameters.AddWithValue("@addr1", data.addr1);
break;
}
鉴于您所做的只是在字符串为 null 或空时使用 ""
作为值,您只是将 null
合并为 ""
。所以就这样做吧:
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num ?? "")
如果您之前没有遇到过空合并运算符 ??
,您可以阅读它 in the documentation。
为此,您可以像这样使用 conditional operator ?:
:
cmd.Parameters.AddWithValue("@AccountNum", String.IsNullOrEmpty(data.Account_Num) ? "" : data.Account_Num);
或者 - 就像 Charles Mager 已经说过的(并且更具可读性) - null-coalescing operator ??
运算符是这样的:
cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num ?? "");
你可以试试这个
cmd.Parameters.AddWithValue("@addr1", string.IsNullOrEmpty(data.addr1) ? "" : data.addr1);
或者更好的是,您可以创建一个扩展方法,当字符串不为 null 或空时,它将 return 字符串的值,否则它将 return 一个空字符串。
使用局部函数(C#7/VS 2017):
void TheOuterFunction()
{
// your cmd is set up here
var cmd = ...;
...;
AddParameter("@AccountNum", data.Account_Num);
AddParameter("@publisher", data.publisher);
...;
void AddParameter(string name, string value)
{
if (String.IsNullOrEmpty(value))
{
cmd.Parameters.AddWithValue(name, "");
}
else
{
cmd.Parameters.AddWithValue(name, value);
}
}
}
这使涉及的逻辑清晰可见,并减少了每个需要逻辑的参数的 "overhead"。
使用单独的函数:
public void SomeFunction()
{
con.Open();
SqlCommand cmd = new SqlCommand("usp_AddPublisher", con);
cmd.CommandText = "usp_AddPublisher";
cmd.CommandType = CommandType.StoredProcedure;
SwitchFunction(data.Account_Num, "@AccountNum", cmd);
SwitchFunction(data.publisher, "@publisher", cmd);
SwitchFunction(data.addr1, "@addr1", cmd);
}
public void SwitchFunction(string testVar, string withVal, SqlCommand cmd)
{
switch (String.IsNullOrEmpty(testVar))
{
case true:
cmd.Parameters.AddWithValue(withVal, string.Empty);
break;
case false:
cmd.Parameters.AddWithValue(withVal, testVar);
break;
}
}