2012-07-05 16 views
10

सी # में, switch कथन में मामलों की सीमाओं को विस्तारित करने की अनुमति नहीं देता है। मुझे इस उद्देश्य के लिए अगर अन्यथा लूप का उपयोग करने का विचार पसंद नहीं है, तो क्या सी # में संख्यात्मक श्रेणियों की जांच करने के अन्य तरीके हैं?स्विच केस, सी # 3.5

+0

कितना बड़ा पर्वतमाला है? – leppie

+0

आप इसे वास्तव में सी # में नहीं कर सकते हैं (जब तक कि यह संख्याओं की एक छोटी सी सीमा न हो जो आप ब्लॉक में सूचीबद्ध कर सकते हैं), लेकिन, एक बार के लिए, आप ** ** VB.Net में कर सकते हैं - http://stackoverflow.com/questions/100 9 0 9 2/चयन-केस-टू-चेक-रेंज-ऑफ-ए-दशमलव-संख्या पर्याप्त रूप से पर्याप्त – dash

+0

अच्छी तरह से आपके पास एक विधि लौटने वाली विधि हो सकती है जो सीमा में होती है और फिर यदि लूप, इसका सरल, पठनीय और काम अच्छी तरह से करता है – V4Vendetta

उत्तर

15

आप एक HashTable क्रमशः Dictionary का उपयोग Condition => Action की मैपिंग बनाने के लिए कर सकते हैं।

उदाहरण:

class Programm 
{ 
    static void Main() 
    { 
     var myNum = 12; 

     var cases = new Dictionary<Func<int, bool>, Action> 
     { 
      { x => x < 3 , () => Console.WriteLine("Smaller than 3") } , 
      { x => x < 30 , () => Console.WriteLine("Smaller than 30") } , 
      { x => x < 300 , () => Console.WriteLine("Smaller than 300") } 
     }; 

     cases.First(kvp => kvp.Key(myNum)).Value(); 
    } 
} 

इस तकनीक switch के लिए एक सामान्य विकल्प है, खासकर यदि क्रिया (एक विधि कॉल की तरह) केवल एक लाइन के होते हैं।

और तुम प्रकार उपनाम के एक प्रशंसक रहे हैं: अगर-किसी और बात से काम करता है

using Int32Condition = System.Collections.Generic.Dictionary<System.Func<System.Int32, System.Boolean>, System.Action>; 
... 
    var cases = new Int32Condition() 
    { 
     { x => x < 3 , () => Console.WriteLine("Smaller than 3") } , 
     { x => x < 30 , () => Console.WriteLine("Smaller than 30") } , 
     { x => x < 300 , () => Console.WriteLine("Smaller than 300") } 
    }; 
+1

+1 एक अच्छा विचार – Alex

+2

के लिए +1 लेकिन आपको एक शब्दकोश नहीं लेना चाहिए (KeyValuePair, Tuple या sth self परिभाषित की एक सूची लें) अन्यथा आप भविष्यवाणी नहीं कर सकते कि फ़ंक्शन को परीक्षण के लिए किस क्रम में बुलाया जाता है। – Oliver

+1

दिलचस्प है लेकिन अगर मैंने वास्तविक प्रोजेक्ट में/else के बदले इस पैटर्न को देखा है तो मैं इसे http://thedailywtf.com पर सबमिट कर रहा हूं :) – Stilgar

5

नहीं। बेशक, यदि श्रेणियां छोटी हैं तो आप

case 4: 
case 5: 
case 6: 
    // blah 
    break; 

दृष्टिकोण का उपयोग कर सकते हैं, लेकिन इसके अलावा: नहीं। if/else का उपयोग करें।

1

नहीं। कम से कम कुछ भी नहीं जो अधिक सुंदर है।

इसके अलावा कोई # 3.5 सी केवल .NET 3.5 और सी # 3.0

4

अगर पर्वतमाला के अंतराल स्थिर है, तुम कोशिश

 int num = 11; 
     int range = (num - 1)/10; //here interval is 10 
     switch (range) 
     { 
      case 0: 
       Console.Write("1-10"); 
       break; // 1-10 
      case 1: 
       Console.Write("11-20"); 
       break; // 11-20 
      // etc... 
     } 

आउटपुट होगा कर सकते हैं: अगर अंतराल है "11-20"
चर तो का उपयोग if/else

1

इस

private void ExecuteInRange(Dictionary<Range,Action<int>> ranges) 
    { 
     foreach (var range in ranges) 
     { 
      if (range.Key.Value < range.Key.Max && range.Key.Value > range.Key.Max) 
       range.Value(range.Key.Value); 
     } 
    } 


public class Range 
{ 
    public int Min { get; set; } 
    public int Max { get; set; } 
    public int Value { get; set; } 
} 
-1

की तरह कुछ प्रयास करें नेस्टेड-आशुलिपि एक प्रकार का है, और साफ है।

myModel.Value = modelResult >= 20 ? 5 : modelResult >= 14 ? 4 : modelResult >= 5 ? 3 : modelResult >= 2 ? 2 : modelResult == 1 ? 1 : 0; 
+0

डाउनग्रेड के लिए कोई कारण? मैंने कोड की 20 पंक्तियों को 1 – blomster

+4

में बदल दिया है जो भयानक है। – ediblecode

1
 int b; 
     b = Int32.Parse(textBox1.Text); 

     int ans = (100-b)/3; //the 3 represents the interval 
     //100 represents the last number 


     switch(ans) 
     { 

      case 0: 
       MessageBox.Show("98 to 100"); 
      break; 

      case 1: 
       MessageBox.Show("95 to 97"); 
      break; 

      case 2: 
       MessageBox.Show("92 to 94"); 
      break; 

      case 3: 
       MessageBox.Show("89 to 91"); 
      break; 

      case 4: 
       MessageBox.Show("86 to 88"); 
      break; 

      default: 
       MessageBox.Show("out of range"); 
      break; 
संबंधित मुद्दे