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