2011-08-24 11 views
19

मैं मैं कहाँ का उपयोगउपयोग string.Contains() स्विच के साथ()

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

किसी भी तरह से switch()if() बयान करने के लिए बदलने के लिए वहाँ हो जाएगा एक सी # अनुप्रयोग कर रहा हूँ?

उत्तर

9

आप पहले चेक कर सकते हैं और फिर स्विच को अपनी पसंद के अनुसार उपयोग कर सकते हैं।

उदाहरण के लिए:

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

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

फिर

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

धन्यवाद! यही वह था जो मुझे – pmerino

26

नहीं, स्विच स्टेटमेंट को संकलन समय स्थिरांक की आवश्यकता होती है। कथन message.Contains("test") संदेश के आधार पर सही या गलत का मूल्यांकन कर सकता है, इसलिए यह निरंतर नहीं है इस प्रकार स्विच स्टेटमेंट के लिए 'केस' के रूप में उपयोग नहीं किया जा सकता है।

+0

तो मैं केवल 'if()' का उपयोग कर सकता हूं? यह बहुत गन्दा है :( – pmerino

+0

@ zad0xsis: क्या आपके पास इनमें से बहुत कुछ है?यदि ऐसा है, तो आप संभावित रूप से विचार को कुछ हद तक अमूर्त कर सकते हैं ... –

+0

हाँ मुझे बहुत कुछ मिला है अगर() 0: – pmerino

23

तुम सिर्फ switch/case का उपयोग करना चाहते हैं, तो आप कुछ इस तरह कर सकते हैं, छद्म कोड:

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

लेकिन अगर कुंजी की मात्रा एक बड़ा है, तो आप सिर्फ यह शब्दकोश के साथ, जगह ले सकता है इस तरह :

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

कुछ कस्टम swtich इस तरह बनाया जा सकता है। कई मामले निष्पादन के साथ-साथ

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

इस

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

की तरह कॉल यह इस लेखन के रूप में सी # 7 में काम करेंगे की अनुमति देता है, यह अभी तक रिलीज़ नहीं किया गया है। लेकिन अगर मैं इसे सही ढंग से समझता हूं, तो यह कोड काम करेगा।

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

स्रोत: https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

+0

नहीं चाहिए, यह काम नहीं करता है। 'वर्तमान संदर्भ में शामिल नहीं है।' – user9993

+1

@ user9993 क्या आपने इसे सी # 7 के साथ आजमाया है? –

3

[श्री के लिए सही अंतिम वाक्य रचना सी] जवाब।

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

आप मामले आदेश की देखभाल के रूप में पहला मैच उठाया जा जाएगा लेना चाहिए:

VS2017RC की रिहाई और उसके सी # 7 समर्थन के साथ यह इस तरह से काम करता है। यही कारण है कि परीक्षण से पहले "test2" रखा गया है।

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

इस तरह, अगर यह प्रदान स्ट्रिंग है कि "स्विच" मैचों में कुछ भी नहीं मिल सकता है:

0

जब एक वातावरण का निर्धारण इस मुद्दे का सामना करते हुए मैं निम्नलिखित एक लाइनर के साथ आया था शर्तों, यह null देता है और देता है। यह एक अलग मूल्य वापस करने के लिए आसानी से संशोधित किया जा सकता है।

यह सख्ती से एक स्विच नहीं है, अगर कथन में अधिक कैस्केडिंग है लेकिन यह साफ है और यह काम करता है।

संबंधित मुद्दे