2010-05-30 5 views
18

मैं सिर्फ सी # सीखना शुरू कर रहा हूं और मैं कुछ बुनियादी पर अटक गया हूं।सी # में असंभव स्विच में दशमलव सीमा का उपयोग कर रहा है?

मेरे पहले "ऐप" के लिए मैंने सोचा कि मैं कुछ आसान के लिए जाऊंगा, इसलिए मैंने बीएमआई कैलकुलेटर का फैसला किया।

बीएमआई की गणना दशमलव प्रकार में की जाती है जिसे मैं अब स्विच स्टेटमेंट में उपयोग करने का प्रयास कर रहा हूं, लेकिन स्पष्ट रूप से स्विच को स्विच में उपयोग नहीं किया जा सकता है?

  decimal bmi = calculate_bmi(h, w); 

      switch (bmi) { 
       case < 18.5: 
        bmi_description = "underweight."; 
        break; 
       case > 25: 
        bmi_description = "overweight"; 
       case > 30: 
        bmi_description = "very overweight"; 
       case > 40: 
        bmi_description = "extreme overweight"; 
        break; 
      } 
+0

आयरनी: http://stackoverflow.com/questions/2875533/what-features-do-you-want-to-see-in-net-5-c-5/2876114#2876114 – Dykam

उत्तर

14

switch बयान केवल integral types (enumerations सूचीबद्ध नहीं हैं लेकिन switch बयानों के साथ इस्तेमाल किया जा सकता है क्योंकि वे एक अभिन्न प्रकार से समर्थन कर रहे हैं) (संदर्भ के लिए टिप्पणी को देखने के तार के रूप में भी चेंजलिंग द्वारा बताया समर्थित हैं) का समर्थन करता है निरंतर मूल्यों के साथ तुलना। इसलिए आपको कुछ if कथन का उपयोग करना होगा।

if (bmi < 18.5M) 
{ 
    bmi_description = "underweight."; 
} 
else if (bmi <= 25) 
{ 
    // You missed the 'normal' case in your example. 
} 
else if (bmi <= 30) 
{ 
    bmi_description = "overweight"; 
} 
else if (bmi <= 40) 
{ 
    bmi_description = "very overweight"; 
} 
else 
{ 
    bmi_description = "extreme overweight"; 
} 

वैसे अपने स्विच बयान थोड़ा weired क्योंकि आप से स्विच कर रहे से अधिक करने के लिए और का उपयोग कर गिरने के माध्यम से कम से कम टूट के बिना है। मुझे लगता है कि कोड को समझने या चेक को पुन: व्यवस्थित करने के लिए केवल एक प्रकार की तुलना का उपयोग करना चाहिए और फॉल-थ्रू का उपयोग न करें।

if (bmi < 18.5M) 
{ 
    bmi_description = "underweight."; 
} 
else if (bmi > 40) 
{ 
    bmi_description = "extreme overweight"; 
} 
else if (bmi > 30) 
{ 
    bmi_description = "very overweight"; 
} 
else if (bmi > 25) 
{ 
    bmi_description = "overweight"; 
} 
else 
{ 
    // You missed the 'normal' case in your example. 
} 
+0

यह थोड़ा गलत है। स्विच ऑपरेटर स्ट्रिंग का भी उपयोग कर सकता है .. यहां देखें: http://msdn.microsoft.com/en-us/library/06tc147t%28VS.71%29.aspx –

+1

इसे इंगित करने के लिए धन्यवाद; उत्तर अद्यतन किया। –

+0

मदद के लिए धन्यवाद! 18.5 दशमलव के बाद एम अन्य समाधानों से क्या गुम था, इसलिए इसने इसे मेरे लिए हल किया। क्या एम के लिए कोई "नाम" है, ताकि मैं कुछ और पढ़ सकूं? – phobia

9

सी # में switch बयानों के साथ संभव नहीं है यही कारण है कि:

क्या इस के लिए सी # समाधान होगा।
कारण यह है कि प्रत्येक केस स्टेटमेंट के बाद निरंतर अभिव्यक्ति की आवश्यकता होती है।

इसके अलावा प्रत्येक मान केवल एक बार अनुमति है और अभिव्यक्ति का प्रकार आपके switch में प्रकार से मेल खाना चाहिए। आपके मामले में ऐसा नहीं है क्योंकि आप बूल प्रकार case कथन चाहते हैं लेकिन आपके switch में दशमलव है।

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

//... 
decimal bmi = calculate_bmi(h, w); 
string bmi_description = get_description_for_bmi(bmi); 
//... 

string get_description_for_bmi(decimal bmi) 
{ 
    string desc; 
    if(bmi < 18.5m) 
     desc = "underweight"; 
    else if(bmi <= 25) 
     desc = "average";//You forgot this one btw 
    else if(bmi <= 30) 
     desc = "overweight"; 
    else if(bmi <= 40) 
     desc = "very overweight";  
    else 
     desc = "extreme overweight"; 

    return desc; 
} 

अतिरिक्त पठन:

इतना ही नहीं की अनुमति नहीं है, लेकिन गैर निरंतर भाव भी अनुमति नहीं है सीमा मान हैं।

bool b = true; 
bool y = false; 
switch (b) 
{ 
    case true: 
     break; 
    case y: 
     break; 
} 

हालांकि यह संभव है:

bool b = true; 
const bool y = false; 
switch (b) 
{ 
    case true: 
     break; 
    case y: 
     break; 
} 
+0

आप इसे सरल बना सकते हैं : आपको 'bmi> 18.5' की जांच करने की आवश्यकता नहीं है, क्योंकि आप' else' में हैं। निम्नलिखित परीक्षणों के लिए भी यही है। 'अगर (बीएमआई <= 18.5) ... और अगर (बीएमआई <= 25) ... और अगर (बीएमआई <= 30) ...' –

+0

@ थॉमस: सच धन्यवाद, तय। –

+0

* * * प्रश्न से कोड के व्यवहार से मेल खाने के लिए <<18.5 के बजाय <18.5 होना चाहिए। –

0

तुम भी संग्रह के कुछ प्रकार है कि कटऑफ मूल्यों और विवरण संग्रहीत करता है इस्तेमाल कर सकते हैं

यहाँ कुछ है कि संभव नहीं है का एक उदाहरण है। (मैं एक सी # विशेषज्ञ नहीं हूं ... शायद Dictionary<decimal,string>?) अपने बीएमआई से कम अंतिम ढूंढने के लिए इसके माध्यम से घुमाएं, और इसके संबंधित लेबल को वापस करें। और समानता -

+0

हाँ यह एक अच्छा समाधान की तरह लगता है ... आपको शब्दकोश जैसे सामान्य संग्रह का उपयोग करके आसानी से कुंजी या मूल्य पर फिर से भरने में सक्षम होना चाहिए। यदि आपको लगता है कि सामान्य रूप से पर्याप्त सामान्य उपयोग का उपयोग करें, अन्यथा एक enumator जैसे enumator का उपयोग करने का प्रयास करें और निरंतर मानों पर स्विच करें जो वर्तमान में एक enum चर है। – IbrarMumtaz

0

स्विच कीवर्ड दशमलव के साथ ठीक काम करता है। यह < है और> जो आपको परेशानी दे रहे हैं।

+0

स्विच * नहीं * दशमलव के साथ सहयोग करता है (इसके अलावा 4.0 में नया है)। –

1

आपका आगे पढ़ने के अनुभाग,

स्विच केवल मूल्यों या मामलों पर साथ संचालित किया जा सकता है जिससे इनपुट मूल्य एक निरंतर मूल्य कि स्विच एक सूचकांक की तरह देखते हैं और एक मामले के अंदर परिभाषित संलग्न कोड निष्पादित कर सकते हैं या केस प्वाइंट या केस लेबल, जो कुछ भी एक दूसरे के लिए इस्तेमाल किया जा सकता है।

पहले उदाहरण में वाई को सही करने के लिए बदलें और स्विच 'बी' पर चलाना चाहिए।

दूसरा उदाहरण काम करता है क्योंकि दूसरा मामला स्थिर या 'कॉन्स्ट' मान पर स्विच कर रहा है। इसलिए आप बुनियादी मानदंडों को पूरा कर रहे हैं या स्विच की क्या ज़रूरत है। यद्यपि यहां पर कई लोग आपको निश्चित रूप से इस तरह कोड नहीं बताएंगे। एक साधारण स्थिर मूल्य पर स्विच करें और सुनिश्चित करें कि आपका स्विच सटीक रूप से आपके द्वारा प्रदान किए गए प्रत्येक वैरिएबल वैरिएबल के अलग-अलग मानों को पूरा करता है।

अपने कोड को मानक के साथ लाइन में लाने के लिए एक enum का उपयोग करने का प्रयास करें। नेट कोडिंग प्रथाओं यह टिप्पणी भी सुनिश्चित करने के साथ लाइन में आती है कि यदि आप इस के करियर बनाना चाहते हैं तो आप किसी भी बुरी आदतों को नहीं उठाते ???

याद रखें: कि आप एक enum का उपयोग कर सकते हैं और इसे दशमलव मानों का उपयोग करने के लिए सेट अप करते हैं क्योंकि दशमलव एक मान प्रकार है, इसलिए यह enum की आवश्यकता के मानदंडों को पूरा करता है। चूंकि एनम को फ्रेम प्रकार में एक मान प्रकार के रूप में परिभाषित किया गया है, इसलिए केवल संख्या प्रकारों जैसे मूल्य प्रकारों को यूर कस्टम कोड कक्षाओं में एनम प्रकार बनाने के लिए सेट अप किया जा सकता है। बस प्रत्येक मान को किसी नाम या किसी प्रकार के साथ संलग्न करें जैसा कि आपने उपरोक्त उपयोग किया है, जैसे वजन और आदि। और सुनिश्चित करें कि enum में प्रत्येक प्रविष्टि के लिए एक तार्किक क्रम है। यानी दशमलव शर्तों के संदर्भ में प्रवेश ऊपर या नीचे जाने की स्पष्ट कट परिभाषा है। एक बार आपका enum सेटअप हो जाने के बाद, आपके द्वारा बनाए गए enum के प्रकार का एक चर बनाएं और फिर इस चर को अपने स्विच में आपूर्ति करें।

मज़े सीखना है।

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

  • कोई संबंधित समस्या नहीं^_^