स्विच केस: क्या मैं एक नंबर के बजाय एक रेंज का उपयोग कर सकता हूं


86

मैं स्विच का उपयोग करना चाहता हूं, लेकिन मेरे पास कई मामले हैं, क्या कोई शॉर्टकट है? अब तक केवल एक ही समाधान मुझे पता है और कोशिश की है:

switch (number)
{
case 1: something; break;
case 2: other thing; break;
...
case 9: .........; break;
}

मुझे आशा है कि मैं ऐसा करने में सक्षम हूं:

switch (number)
{
case (1 to 4): do the same for all of them; break;
case (5 to 9): again, same thing for these numbers; break;
}

1
आप इस तरह के परिदृश्य के लिए और-का उपयोग कर सकते हैं
सतपाल

जवाबों:


226

इस प्रश्न के लिए गेम में थोड़ा देर हो गई है, लेकिन हाल ही में C # 7 में पेश किए गए परिवर्तनों (डिफ़ॉल्ट रूप से विजुअल स्टूडियो 2017 / .NET फ्रेमवर्क 4.6.2 में उपलब्ध है), रेंज-आधारित स्विचिंग अब switchस्टेटमेंट के साथ संभव है ।

उदाहरण:

int i = 63;

switch (i)
{
    case int n when (n >= 100):
        Console.WriteLine($"I am 100 or above: {n}");
        break;

    case int n when (n < 100 && n >= 50 ):
        Console.WriteLine($"I am between 99 and 50: {n}");
        break;

    case int n when (n < 50):
        Console.WriteLine($"I am less than 50: {n}");
        break;
}

टिप्पणियाँ:

  • कोष्ठक (और हालत )में आवश्यक नहीं whenहैं, लेकिन तुलना (ओं) को उजागर करने के लिए इस उदाहरण में उपयोग किया जाता है।
  • varके एवज में भी इस्तेमाल किया जा सकता है int। उदाहरण के लिए case var n when n >= 100::।

10
आप सर, मेरे हीरो हैं। मैं कुछ शपथ शब्द के साथ इस पर जोर देना चाहता था, लेकिन नहीं। :)
गावी यूनफ

2
(और )चारों ओर whenहालत अनावश्यक हैं। यानी case int n when n >= 100:काम भी करता है।
उवे कीम

6
यहां तक कि varकाम करता है: IE case var n when n >= 100:
उवे कीम

9
@JamesKo मुझे लगता है कि यह साफ है और बयानों के एक समूह की तुलना में पठनीयता में सुधार करता है, खासकर यदि आपके पास 3-4 से अधिक स्थितियां हैं।
साच

1
बयानों की एक गुच्छा के लिए बहुत बेहतर है, यह बहुत क्लीनर है।
जॉन स्टॉक

44

आपकी समस्या बयान के लिए एक बेहतर और सुरुचिपूर्ण समाधान है।

int mynumbercheck = 1000;
// Your number to be checked
var myswitch = new Dictionary <Func<int,bool>, Action>
            { 
             { x => x < 10 ,    () => //Do this!...  },  
             { x => x < 100 ,    () => //Do this!...  },
             { x => x < 1000 ,    () => //Do this!...  },
             { x => x < 10000 ,   () => //Do this!... } ,
             { x => x < 100000 ,  () => //Do this!... },
             { x => x < 1000000 ,  () => //Do this!... } 
            };

अब हमारे सशर्त स्विच को कॉल करने के लिए

   myswitch.First(sw => sw.Key(mynumbercheck)).Value();

स्विच / ifElse के लिए वैकल्पिक


1
@Axxaya मुझे अभी भी लगता है कि स्विच को C # में बढ़ाया जाना चाहिए, लेकिन यह शानदार लग रहा है और वास्तव में अच्छी तरह से काम करता है। वास्तव में इस उदाहरण को साझा करने की सराहना करते हैं। धन्यवाद
WonderWorker

यह स्विच / केस प्रश्न में श्रेणी के लिए स्पष्ट उत्तर नहीं है।
सूचक 31

13
शब्दकोश उन मूल्यों को संग्रहीत और वापस नहीं करता है जिसमें उन्हें जोड़ा जाता है। यह Microsoft कंपाइलर के साथ काम करने के लिए होता है, लेकिन कोई आसानी से एक कंपाइलर कंपाइलर लिख सकता है जहां यह काम नहीं करता है। इसके बजाय सूची <KeyValuePair <Func <int, bool>, Action >> का उपयोग करें। यह भी ध्यान रखें कि डेटा संरचना को उत्पन्न करने के लिए एक लागत है और इसलिए यह संभवत: एक स्थिर पठनीय सदस्य होना चाहिए।
नाथन फिलिप्स

@PointerNull: कृपया भविष्य में संदर्भ के लिए टिप्पणियों में लिखे गए आवश्यक कोड के लिए ब्लॉग को फिर से देखें
अक्साया

@ नथनपिलिप्स: इसे लाने के लिए धन्यवाद। वास्तव में, IList संग्रह भी एक विकल्प होगा। यह सिर्फ एक नमूना था जिसे मैंने सूची <t> का उपयोग करके जटिल मापदंडों के साथ लागू किया है।
19

13

मैं आपकी स्विच स्थितियों को वर्गीकृत करने के लिए टर्नरी ऑपरेटरों का उपयोग करूंगा।

इसलिए...

switch( number > 9 ? "High" :
        number > 5 ? "Mid" :
        number > 1 ? "Low" : "Floor")
        {
              case "High":
                    do the thing;
                    break;
               case "Mid":
                    do the other thing;
                    break;
               case "Low":
                    do something else;
                    break;
               case "Floor":
                    do whatever;
                    break;
         }

12

धागा पूरा करने के लिए, यहाँ C # 8 के साथ वाक्य रचना है:

  var percent = price switch
  {
    var n when n >= 1000000 => 7f,
    var n when n >= 900000 => 7.1f,
    var n when n >= 800000 => 7.2f,
    _ => 0f // default value
  };

यदि आप श्रेणियाँ निर्दिष्ट करना चाहते हैं:

  var percent2 = price switch
  {
    var n when n >= 1000000 => 7f,
    var n when n < 1000000 && n >= 900000 => 7.1f,
    var n when n < 900000 && n >= 800000 => 7.2f,
    _ => 0f // default value
  };

8

यदि उस स्थिति में अन्य का उपयोग किया जाना चाहिए, लेकिन यदि किसी कारण से स्विच की आवश्यकता अभी भी है, तो आप नीचे के रूप में कर सकते हैं, बिना ब्रेक के पहले मामले पहले ब्रेक के सामने आने तक प्रचारित करेंगे। जैसा कि पिछले उत्तरों ने सुझाव दिया है कि मैं अगर-और स्विच पर सलाह देता हूं।

switch (number){
            case 1:
            case 2:
            case 3:
            case 4: //do something;
                    break;
            case 5:
            case 6:
            case 7:
            case 8:
            case 9: //Do some other-thing;
                   break;
        }

8

आप अपनी सीमाओं switchके साथ संयोजन के रूप में उपयोग करके "हैंडल" पर्वतमाला का निर्माण कर सकते थे List

List<int> bounds = new List<int>() {int.MinValue, 0, 4, 9, 17, 20, int.MaxValue };

switch (bounds.IndexOf(bounds.Last(x => x < j)))
{
    case 0: // <=0
        break;

    case 1: // >= 1 and <=4
        break;
    case 2: // >= 5 and <=9
        break;
    case 3: // >= 10 and <=17
        break;
    case 4: // >= 18 and <=20
        break;

    case 5: // >20
        break;
}

इस दृष्टिकोण के साथ रेंज में अलग-अलग स्पैन हो सकते हैं।


6

अंतराल निरंतर है:

 int range = 5
 int newNumber = number / range;
 switch (newNumber)
 {
      case (0): //number 0 to 4
                break;
      case (1): //number 5 to 9
                break;
      case (2): //number 10 to 14
                break;
      default:  break;
 }

अन्यथा:

  if else

3

जैसा कि उल्लेख किया if-elseगया है इस मामले में बेहतर होगा, जहां आप एक सीमा को संभालेंगे:

if(number >= 1 && number <= 4)
{
   //do something;
}
else if(number >= 5 && number <= 9)
{
   //do something else;
}

2

.Net में केवल विजुअल बेसिक स्विच स्टेटमेंट्स में रेंज की अनुमति देता है, लेकिन C # में इसके लिए कोई सिंटैक्स नहीं है।

C # में आपकी विशिष्ट समस्या से निपटने के बाद, मैं इसे इस प्रकार हल करूंगा:

if(number >= 1 && number <= 9) // Guard statement
{
    if(number < 5)
    {
        // Case (1 to 4):

        //break;

    }
    else
    {
        // Case (5 to 9):

        //break;

    }

}
else
{
    // Default code goes here

    //break;

}

इसे और स्पष्ट करने के लिए, मान लीजिए कि आपके पास प्रतिशत मूल्य है।

एक टेम्पलेट के रूप में अपनी समस्या का उपयोग करना, आप इस तरह दिखना चाहेंगे:

switch (percentage)
{
    case (0 to 19):
        break;

    case (20 to 39):
        break;

    case (40 to 69):
        break;

    case (70 to 79):
        break;

    case (80 to 100):
        break;

    default:
        break;

}

हालाँकि, चूंकि C # उस सिंटैक्स की अनुमति नहीं देता है, यहाँ एक समाधान है जो C # अनुमति देता है:

if (percentage >= 0 && percentage <= 100) // Guard statement
{
    if (percentage >= 40)
    {
        if (percentage >= 80)
        {
            // Case (80% to 100%)

            //break;

        }
        else
        {
            if (percentage >= 70)
            {
                // Case (70% to 79%)

                //break;

            }
            else
            {
                // Case (40% to 69%)

                //break;

            }

        }

    }
    else
    {
        if (percentage >= 20)
        {
            // Case (20% to 39%)

            //break;

        }
        else
        {
            // Case (0% to 19%)

            //break;

        }

    }

}
else
{
    // Default code goes here

    //break;

}

इसका उपयोग करने में थोड़ा समय लग सकता है, लेकिन इसे प्राप्त करने के बाद यह ठीक है।

व्यक्तिगत रूप से, मैं पर्वतमाला की अनुमति के लिए स्विच स्टेटमेंट का स्वागत करूंगा।

C # स्विच स्टेटमेंट का भविष्य

यहाँ कुछ विचार दिए गए हैं कि स्विच स्टेटमेंट को कैसे बेहतर बनाया जा सकता है:

संस्करण ए

switch(value)
{
    case (x => x >= 1 && x <= 4):
    break;

    case (x => x >= 5 && x <= 9):
    break;

    default:
    break;

}

संस्करण बी

switch(param1, param2, ...)
{
    case (param1 >= 1 && param1 <= 4):
    break;

    case (param1 >= 5 && param1 <= 9 || param2 != param1):
    break;

    default:
    break;

}

1

यदि आप C / C ++ का उपयोग करते हैं, तो कोई "श्रेणी" सिंटैक्स नहीं है। आप केवल "केस" खंड के बाद सभी मान सूचीबद्ध कर सकते हैं। भाषा Ada या पास्कल समर्थन सीमा सिंटैक्स है।


0

सबसे पहले, आपको उस प्रोग्रामिंग भाषा को निर्दिष्ट करना चाहिए जिसका आप उल्लेख कर रहे हैं। दूसरा, switchबयानों को स्विच किए गए चर के बारे में विकल्पों के बंद सेटों के लिए ठीक से उपयोग किया जाता है, जैसे एन्यूमरेशन या पूर्वनिर्धारित स्ट्रिंग्स। इस मामले के लिए, मैं अच्छे पुराने if-elseढांचे का उपयोग करने का सुझाव दूंगा।


0

switchमामले के माध्यम से यह असंभव है। आप बयानों के साथ नेस्टेड जा सकते हैं।

if(number>=1 && number<=4){
//Do something
}else if(number>=5 && number<=9){
//Do something
}

(number >= 1 && number <= 4)प्रत्येक नंबर की जाँच के बजाय अच्छे पुराने के बारे में क्या ? आप 1 और 120 के बीच कैसे लिखेंगे ? ;-)
DarkDust

ओह, और =बनाम पर ध्यान दें ==
डार्कडस्ट

-1

यदि प्रश्न C के बारे में था (आपने नहीं कहा), तो इसका उत्तर नहीं है, लेकिन : GCC और Clang (शायद अन्य) एक श्रेणी सिंटैक्स का समर्थन करते हैं , लेकिन यह ISO C मान्य नहीं है:

switch (number) {
    case 1 ... 4:
        // Do something.
        break;

    case 5 ... 9:
        // Do something else.
        break;
}

पहले और बाद में एक जगह होना सुनिश्चित करें ...अन्यथा आपको सिंटैक्स त्रुटि मिलेगी।


पास्कल / डेल्फी भी यही करता है। 1..4 का केस नंबर: कुछ करो; आदि
केल

प्रश्न C #
SuB

@SuB: मुझे पता है। मैंने इस सवाल के साथ C # टैग को जोड़ा क्योंकि ओपी ने हमें बताया कि सवाल किस भाषा का है। लेकिन जवाब अभी भी उन लोगों के लिए उपयोगी हो सकता है जो एक खोज इंजन के माध्यम से यहां आते हैं, यही कारण है कि मैंने इसे नहीं हटाया है।
डार्कडस्ट

-1

सी # स्विच मामलों में मूल रूप से आगे क्या करना है पर शब्दकोशों हैं। चूंकि आप एक शब्दकोश में एक सीमा तक नहीं देख सकते हैं, सबसे अच्छा आप कर सकते हैं मामला है ... जब बयान स्टीव गोमेज़ ने उल्लेख किया है।


-3

आप के साथ if-else स्टेटमेंट का उपयोग कर सकते हैं || ऑपरेटर (या ऑपरेटर) जैसे:

if(case1 == true || case2 == true || case3 == true)
   {
    Do this!... 
   }
else if(case4 == true || case5 == true || case6 == true)
   {
    Do this!... 
   }
else if(case7 == true || case8 == true || case9 == true)
   {
    Do this!... 
   }

वाह, यह कुछ के लिए थोड़ा जटिल है if (number >= 1 && number <= 4) { … } else if (number >= 5 && number <= 9) { … }, आपको नहीं लगता?
डार्कडस्ट नोव

अरे ठीक है हाँ ... एहम लेकिन अगर उन मामलों को जो एक ही बात करने वाले हैं तो आदेश दिया गया है कि आपको 'का उपयोग करने की आवश्यकता है' || ऑपरेटर '...
लुकास वार्सिट्ज

लेकिन उसकी बात यह जांचने के लिए थी कि क्या कोई संख्या सीमा के भीतर है, इसलिए आदेश कोई फर्क नहीं पड़ता ( जाँच की गई सीमाओं को छोड़कर )।
डार्कडस्ट नोव

यह कोई गलती नहीं है , आपका समाधान गलत नहीं है, बस जटिल ;-)
DarkDust

== सच: face_palm: यह डिफ़ॉल्ट व्यवहार है और == गलत आप ऑपरेटर का उपयोग नहीं कर सकते हैं
Et7f3XIV
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.