2017-06-22 59 views
0

可能的C#切換這些語句?我不夠明亮,看不到這種可能性。可能的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. 
     } 
+1

這是不會做你想做的,如果你的字符串是什麼'「企業編碼| costCenter | acc_code「'。 –

+0

您正在尋找的關鍵字是否互斥?目前,如果有多個匹配項,您可能會在排序表達式中出現重複的字段。 – StuartLC

+0

@StuartLC sortExpression來自網格視圖,所以我不認爲它會重複。 – Pop

回答

2

您當然可以減少代碼重複。

試試這個:

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. 
} 
0

不,因爲您正在測試不同的變量到一個共同的值。 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)爲不同的值,而不是周圍的其他方式。

0

我不認爲這是做你想要什麼。
首先,如果您搜索「companyCode」並添加2個其他字段(如果存在)。
所以當第一個如果是真的,比其他2個ifs將是真實的,因爲您將在其中添加其他字段。

如果最初sortExpression只有單個字段,則可以將其更改爲「切換」。

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)); 
}