2017-06-22 6 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

これはあなたの文字列は '" companyCodeであれば、あなたがやりたいことするつもりはないが| COSTCENTER | acc_code "' –

+0

あなたが探しているキーワードは、互いに排他的ですか?現在、複数のマッチが行われた場合は、あなたのsortexpressionに重複したフィールドがある可能性があります。 – 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つの他のフィールドを追加すると、最初に表示されます。
最初のifがtrueの場合、他の2つのifsが真とな​​ります。最初のifの中に他のフィールドを追加します。

最初に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)); 
} 
関連する問題