繁体   English   中英

可以用C#切换这些语句吗?

[英]Possible to C# switch these statements?

可以用C#切换这些语句吗? 我不够聪明,看不到这种可能性。

        if (sortExpression.IndexOf("companyCode", StringComparison.OrdinalIgnoreCase) >= 0)
        {
            sortExpression += ", costCenter, acc_code";
        }
        if (sortExpression.IndexOf("costCenter", StringComparison.OrdinalIgnoreCase) >= 0)
        {
            sortExpression += ", companyCode, acc_code";
        }
        if (sortExpression.IndexOf("acc_code", StringComparison.OrdinalIgnoreCase) >= 0)
        {
            sortExpression += ", companyCode, costCenter";
        }
        {
            //default, everything else.
        }

您当然可以减少代码重复。

尝试这个:

var map = new Dictionary<string, string>()
{
    { "companyCode", ", costCenter, acc_code" },
    { "costCenter", ", companyCode, acc_code" },
    { "acc_code", ", companyCode, costCenter" },
};

var value =
    map
        .Where(x => sortExpression.IndexOf(x.Key, StringComparison.OrdinalIgnoreCase) >= 0)
        .Select(x => x.Value)
        .FirstOrDefault();

if (value != null)
{
    sortExpression += value;
}
else
{
    //default, everything else.
}

否,因为您要测试不同的变量是否具有相同的值。 switch语句将一个公共变量测试为不同的值。 为了使switch语句在您的情况下起作用,每个if语句都必须比较同一变量。

    if (sortExpression.IndexOf("companyCode", StringComparison.OrdinalIgnoreCase) >= 1)
    {
        sortExpression += ", costCenter, acc_code";
    }
    if (sortExpression.IndexOf("companyCode", StringComparison.OrdinalIgnoreCase) >= 2)
    {
        sortExpression += ", companyCode, acc_code";
    }
    if (sortExpression.IndexOf("companyCode", StringComparison.OrdinalIgnoreCase) >= 3)
    {
        sortExpression += ", companyCode, costCenter";
    }
    {
        //default, everything else.
    }

如您所见,所有变量都将sortExpression.IndexOf("companyCode", StringComparison.OrdinalIgnoreCase)与不同的值进行比较,而不是相反。

我不认为这是您想要的。
首先,如果您搜索“ companyCode”并添加其他2个字段(如果存在)。
因此,当first if为true时,其他2个ifs为true,因为您将在first if中添加其他字段。

如果最初的sortExpression具有单个字段,则可以将其更改为“ switch”。

switch (sortExpression)
{
    case "companyCode":
        sortExpression += ", costCenter, acc_code";
        break;
    case "costCenter":
        sortExpression += ", companyCode, acc_code";
        break;
    case "acc_code":
        sortExpression += ", companyCode, costCenter";
        break;
    default:
        //default, everything else.
        break;
}

如果没有,您可以使用类似以下的方法:

public string GetSortExpression(string sortExpression)
{
    List<string> requiredFields = new List<string>(new[] { "companyCode", "costCenter", "acc_code" });
    if (string.IsNullOrEmpty(sortExpression) // string is null or empty
        || !requiredFields.Any(x => sortExpression.IndexOf(x, StringComparison.OrdinalIgnoreCase) >= 0)) // string does not contain any of fields
    {
        sortExpression = "default, everything else";
    }
    else
    {
        List<string> fields =
        sortExpression.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToList();
        fields.AddRange(requiredFields.Except(fields));
        sortExpression = string.Join(", ", fields);
    }
    return sortExpression;
}

测试:

[TestCase(null, "default, everything else")]
[TestCase("", "default, everything else")]
[TestCase("companyCode", "companyCode, costCenter, acc_code")]
[TestCase("costCenter", "costCenter, companyCode, acc_code")]
[TestCase("acc_code", "acc_code, companyCode, costCenter")]
[TestCase("acc_code, companyCode", "acc_code, companyCode, costCenter")]
[TestCase("acc_code, costCenter", "acc_code, costCenter, companyCode")]
public void GetSortExpressionTest(string initial, string exprectedResult)
{
    Assert.AreEqual(exprectedResult, GetSortExpression(initial));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM