2012-04-21 13 views
3

switchのようなC#の構文は、制御が次のレベルに落ちるのを許していますか?私はこのようなものがあります:switch文のようなものが欲しいですが(もちろん違います)

public static IEnumerable<string> SeverityOrHigher(string severity) 
    { 
     var result = new List<string>(); 

     switch (severity.ToUpper()) 
     { 
      case "ALL": 
       result.Add("ALL"); 
      case "DEBUG": 
       result.Add("DEBUG"); 
      case "INFO": 
       result.Add("INFO"); 
      case "WARN": 
       result.Add("WARN"); 
      case "ERROR": 
       result.Add("ERROR"); 
      case "FATAL": 
       result.Add("FATAL"); 
      case "OFF": 
       result.Add("OFF"); 
      default: 
       break; 
     } 

     return result; 
    } 

...明らかに、C#で(Control cannot fall through from one case label...)が動作しない、まだそれが必要のように、それは私には思えます。私はそれがそこに休憩を期待していることを知っているが、それは私に私が探しているデータフローを与えることはありません。これを私が望むやり方で実現させるためには何ができますか?

+3

*正確に*あなたが達成しようとしていますか? – ChrisF

+0

あなたは 'goto case" DEBUG "などを使うことができましたが、あなたは' goto'を使っているので、Dijkstraはあなたを嫌いにします。 – harold

+0

列挙型のように見えますが、ここでは根本的な要件を満たしているでしょう。 –

答えて

10

あなたはLINQの少しで「落下の場合を」エミュレートすることができます:

public static IEnumerable<string> SeverityOrHigher(string severity) 
{ 
    var result = new List<string>() 
     { "ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "OFF" }; 
    return result.SkipWhile(l => l != severity.ToUpper()).ToArray(); 
} 
+0

これは見た目が面白いです。まだ私が望んでいたC#言語の構成ではありませんが、switch節のgoto文よりもきれいです。 –

+0

LINQは道のりです。 –

+0

これはちょっと「賢い」かもしれませんが、「goto case」を使うよりも読みやすいと思います。 – nemesv

0

は非常に素晴らしい見えませんが、あなたのために仕事をすることができます:あなたのケースでは

string s = severity.ToUpper(); 
result.add("OFF"); 
if (s == "OFF") 
    return result; 
result.add("FATAL"); 
if (s == "FATAL") 
    return result; 
result.add("ERROR"); 
if (s == "ERROR") 
    return result; 
// ... 
result.add("ALL"); 
return result; 
+0

bleargh ...ええ。これもうまくいくでしょうが、私はそれが扱いにくいC#の構造があることを期待しています。 –

1

それをグラム私は思い

switch (severity.ToUpper()) 
{ 
    case "ALL": 
    result.Add("ALL"); 
    goto case "DEBUG"; 
    case "DEBUG": 
    result.Add("DEBUG"); 
    goto case "INFO"; 
    case "INFO": 
    result.Add("INFO"); 
    goto case "WARN"; 
    case "WARN": 
    result.Add("WARN"); 
    goto case "ERROR"; 
    case "ERROR": 
    result.Add("ERROR"); 
    goto case "FATAL"; 
    case "FATAL": 
    result.Add("FATAL"); 
    goto case "OFF"; 
    case "OFF": 
    result.Add("OFF"); 
    break; 
    default: 
    break; 
} 
+0

これは...正しいとは思わない。私はこれが適切な結果を達成するとは思わない。 –

+0

申し訳ありませんコピー貼り間違い、回答編集 – Xharze

+0

はい、これは動作しますが、はい、これは最適ではありません。私は、MSがGOTOステートメントを使っていたとは思えません。 –

0

:最適なソリューションではありませんが、あなたは、このようなgotoステートメントを使用することができます

public static IEnumerable<string> SeverityOrHigher(string severity) 
{ 
    var result = new List<string>(); 
    var severities = new List<string> { "ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "OFF" }; 

    severity = severity.ToUpper(); 

    if (severities.Contain(severity)) 
      result.Add(severity); 

    return result; 
} 
+0

これは私がしようとしていることを達成するとは思わない。 –

1

使用後藤:

 switch (severity.ToUpper()) 
     { 
      case "ALL": 
       result.Add("ALL"); 
       goto case "DEBUG"; 
      case "DEBUG": 
       result.Add("DEBUG"); 
       goto case "INFO"; 
      case "INFO": 
       result.Add("INFO"); 
       goto case "WARN"; 
      case "WARN": 
       result.Add("WARN"); 
       goto case "ERROR"; 
      case "ERROR": 
       result.Add("ERROR"); 
       goto case "FATAL"; 
      case "FATAL": 
       result.Add("FATAL"); 
       goto case "OFF"; 
      case "OFF": 
       result.Add("OFF"); 
       break; 
      default: 
       break; 
     } 

マイクロソフト(暗黙的に)は、この使用することを推奨しています:http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.71).aspx

入力重症度は、それらの一つである場合に有効なすべての重大度を表している別のリストを作成し、チェックのようなsomehtingとO GOTOSなどとともに
+0

はいこれはうまくいくでしょう。それは愚かであるように思われる。それは美学かもしれませんが、私のコードに 'goto'節を置くという考えは...魅力的ではありません。 :) –

+0

私は同意すると、明確なフォールスルーキーワードは理想的だと思いますが、少なくともこれはオプションです。 –

2

、あなたが列挙型とLINQのビットこれを行うことができます:

public static IEnumerable<Severity> SeverityOrHigher(Severity severity) 
    { 
     var value = (int) severity; 

     return Enum.GetValues(typeof (Severity)) 
      .Cast<int>() 
      .Where(i => i >= value) 
      .Select(i => (Severity) i); 
    } 

    public enum Severity 
    { 
     All = 0, 
     Trace = 1, 
     Debug = 2, 
     Information = 3, 
     Warning = 4, 
     Error = 5, 
     Fatal = 6 
    } 
+0

私はこれをやろうと考えました...残念なことに、ログの重大度(log4net経由の文字列)をすべてのエントリで解析することを暗示していました。 –

1

@ nemesvのLinqの答えは良い解決策ですが、スイッチでそれをやりたいのであれば、このようにすることができ、同じ結果が得られます。

public static IEnumerable<string> SeverityOrHigher(string severity) 
{ 
    var lastFound = -1; 

    var severityList = new List<string>() { "ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "OFF" }; 
    var results = new List<string>(); 

    foreach (var t in severityList) 
    { 

    if (lastFound > -1) 
    { 
     for (var index = lastFound + 1; index < severityList.Count; index++) 
     { 
     results.Add(severityList[index]); 
     } 
     return results; 
    } 

    switch (severity.ToUpper()) 
    { 
     case "ALL": 
     results.Add(severity); 
     lastFound = 0; 
     break; 
     case "DEBUG": 
     lastFound = 1; 
     results.Add(severity); 
     break; 
     case "INFO": 
     lastFound = 2; 
     results.Add(severity); 
     break; 
     case "WARN": 
     lastFound = 3; 
     results.Add(severity); 
     break; 
     case "ERROR": 
     lastFound = 4; 
     results.Add(severity); 
     break; 
     case "FATAL": 
     lastFound = 5; 
     results.Add(severity); 
     break; 
     case "OFF": 
     lastFound = 6; 
     results.Add(severity); 
     break; 
    } 
    } 

    return results; 
} 

テスト:

var list = SeverityOrHigher("ALL"); 
    foreach (var severity in list) 
    { 
    Console.WriteLine(severity); 
    } 

    Console.ReadKey(); 
関連する問題