2011-08-24 13 views
19

Robię aplikację C#, gdzie używamZastosowanie string.Contains() z wyłącznikiem()

if ((message.Contains("test"))) 
{ 
    Console.WriteLine("yes"); 
} else if ((message.Contains("test2"))) { 
    Console.WriteLine("yes for test2"); 
} 

Nie będzie jakiś sposób aby zmienić switch() sprawozdania if()?

Odpowiedz

9

Możesz najpierw sprawdzić, a następnie użyć przełącznika, jak chcesz.

Na przykład:

string str = "parameter"; // test1..test2..test3.... 

if (!message.Contains(str)) return ; 

Następnie

switch(str) 
{ 
    case "test1" : {} break; 
    case "test2" : {} break; 
    default : {} break; 
} 
+0

dzięki! Właśnie to było mi potrzebne – pmerino

26

Nie, instrukcja switch wymaga kompilacji stałych czasowych. Instrukcja message.Contains("test") może ocenić wartość true lub false w zależności od komunikatu, więc nie jest stała, dlatego nie może być używana jako "case" dla instrukcji switch.

+0

Więc mogę używać tylko 'if()'? To dość nieporządne :( – pmerino

+0

@ zad0xsis: Czy masz dużo takich?Jeśli tak, to możesz potencjalnie zinterpretować pomysł nieco ... –

+0

tak, mam dużo 'if()' :( – pmerino

23

Jeśli tylko chcesz używać switch/case, można zrobić coś takiego pseudo-kod:

string message = "test of mine"; 
    string[] keys = new string[] {"test2", "test" }; 

    string sKeyResult = keys.FirstOrDefault<string>(s=>message.Contains(s)); 

    switch (sKeyResult) 
    { 
     case "test": 
      Console.WriteLine("yes for test"); 
      break; 
     case "test2": 
      Console.WriteLine("yes for test2"); 
      break; 
    } 

Ale jeśli ilość klawiszy jest duża, można po prostu zastąpić go słowniku, jak to :

static Dictionary<string, string> dict = new Dictionary<string, string>(); 
static void Main(string[] args) 
{ 
    string message = "test of mine";  

    // this happens only once, during initialization, this is just sample code 
    dict.Add("test", "yes"); 
    dict.Add("test2", "yes2"); 


    string sKeyResult = dict.Keys.FirstOrDefault<string>(s=>message.Contains(s)); 

    Console.WriteLine(dict[sKeyResult]); //or `TryGetValue`... 
} 
1

Niektóre zwyczaj swtich mogą być tworzone w taki sposób. Umożliwia wielokrotne wykonanie przypadku również

public class ContainsSwitch 
{ 

    List<ContainsSwitch> actionList = new List<ContainsSwitch>(); 
    public string Value { get; set; } 
    public Action Action { get; set; } 
    public bool SingleCaseExecution { get; set; } 
    public void Perform(string target) 
    { 
     foreach (ContainsSwitch act in actionList) 
     { 
      if (target.Contains(act.Value)) 
      { 
       act.Action(); 
       if(SingleCaseExecution) 
        break; 
      } 
     } 
    } 
    public void AddCase(string value, Action act) 
    { 
     actionList.Add(new ContainsSwitch() { Action = act, Value = value }); 
    } 
} 

połączenia jak ten

string m = "abc"; 
ContainsSwitch switchAction = new ContainsSwitch(); 
switchAction.SingleCaseExecution = true; 
switchAction.AddCase("a", delegate() { Console.WriteLine("matched a"); }); 
switchAction.AddCase("d", delegate() { Console.WriteLine("matched d"); }); 
switchAction.AddCase("a", delegate() { Console.WriteLine("matched a"); }); 

switchAction.Perform(m); 
2

To będzie pracować w C# 7. W chwili pisania tego, że musi jeszcze zostać zwolniony. Ale , jeśli rozumiem to poprawnie, ten kod będzie działał.

switch(message) 
{ 
    case Contains("test"): 
     Console.WriteLine("yes"); 
     break; 
    case Contains("test2"): 
     Console.WriteLine("yes for test2"); 
     break; 
    default: 
     Console.WriteLine("No matches found!"); 
} 

Źródło: https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

+0

Nie, to nie działa. 'Contains nie istnieje w bieżącym kontekście." – user9993

+1

@ user9993 Czy próbowałeś tego z C# 7? –

3

Prawidłowe końcowy składnia [Mr. Odpowiedź C] s.

Wraz z wydaniem VS2017RC i jej wsparcia C# 7 działa w ten sposób:

switch(message) 
{ 
    case string a when a.Contains("test2"): return "no"; 
    case string b when b.Contains("test"): return "yes"; 
} 

powinien dbać o sprawy zamawiającego jako pierwszy mecz będzie zrywane. Właśnie dlatego "test2" jest umieszczany przed testem.

0

obliczu tego problemu przy określaniu środowiska, wpadłem na następujący-liner:

string ActiveEnvironment = localEnv.Contains("LIVE") ? "LIVE" : (localEnv.Contains("TEST") ? "TEST" : (localEnv.Contains("LOCAL") ? "LOCAL" : null)); 

ten sposób, jeśli nie można znaleźć coś w przewidzianym ciąg, który pasuje do „przełącznik” warunki, rezygnuje i zwraca null. Można to łatwo zmienić, aby zwrócić inną wartość.

To nie jest strictly przełącznik, bardziej kaskadowy, jeśli instrukcja, ale jest czysty i działał.

Powiązane problemy