1

如何在 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;
            }
4

5 回答 5

2

Given all you're doing is using "" as the value when a string is null or empty, you're just coalescing null to "". So just do that:

cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num ?? "")

If you've not come across the null coalescing operator ?? before, you can read about it in the documentation.

于 2017-05-16T14:18:49.417 回答
1

你可以试试这样

cmd.Parameters.AddWithValue("@addr1", string.IsNullOrEmpty(data.addr1) ? "" : data.addr1);

或者更好的是,您可以创建一个扩展方法,当字符串不为空或空时,它会返回字符串的值,否则它将返回一个空字符串。

于 2017-05-16T14:18:55.533 回答
0

For this purpose you can use the conditional operator ?: like this:

cmd.Parameters.AddWithValue("@AccountNum", String.IsNullOrEmpty(data.Account_Num) ? "" : data.Account_Num);

or - like Charles Mager already stated (and is more readable) - the null-coalescing operator ?? operator like this:

cmd.Parameters.AddWithValue("@AccountNum", data.Account_Num ?? "");
于 2017-05-16T14:18:51.963 回答
0

使用本地函数(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);
        }
    }
}

这使所涉及的逻辑清晰可见,并减少了需要逻辑的每个参数的“开销”。

于 2017-05-16T14:22:22.043 回答
0

使用单独的函数:

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;
    }
}
于 2017-05-16T14:28:14.333 回答