2011-11-16 12 views
13

क्या मैं पागल हूं या सी # में, एक चर के स्विच में एक चर सेट करने के लिए कोई तरीका है? कुछ ऐसा:स्विच के परिणाम में एक चरणीय सेट करना

var a = switch(b) 
    { 
    case c: 
    d; 
    case e: 
    f; 
    default: 
    g; 
    }; 

क्या यह किसी अन्य भाषा में संभव है? मैंने सोचा कि यह था, लेकिन मुझे संकलन करने के लिए कुछ भी नहीं मिल रहा है। अग्रिम में धन्यवाद।

+3

'स्विच (बी) {केस सी: ए = डी; मामला ई: ए = एफ; डिफ़ॉल्ट: ए = जी;} ' –

+0

एफ # इस – BLUEPIXY

उत्तर

20

नहीं, switch एक अभिव्यक्ति के बजाय एक बयान है जिसका मूल्यांकन किया जा सकता है।

बेशक

, आप इसे किसी अन्य विधि में निकाल सकते हैं:

int x = DoSwitch(y); 

... 

private int DoSwitch(int y) 
{ 
    switch (y) 
    { 
     case 0: return 10; 
     case 1: return 20; 
     default: return 5; 
    } 
} 

वैकल्पिक रूप से, आप एक Dictionary इस्तेमाल कर सकते हैं, तो यह सिर्फ सरल, निरंतर मैपिंग का मामला है। यदि आप हमें जो हासिल करने की कोशिश कर रहे हैं उसके बारे में अधिक जानकारी दे सकते हैं, तो हम शायद वहां पहुंचने के सबसे बेवकूफ तरीके से काम करने में आपकी सहायता कर सकते हैं।

+0

पसंद है, मैं निश्चित रूप से इसे दस लाख तरीकों से समझ सकता हूं, मेरे पास सिर्फ एक = प्रत्येक कथन में जो कुछ भी था और सोचा था कि मैंने ऐसा देखा था। अनुमान नहीं। ओह अच्छा। कोई बड़ी बात नहीं। – vbullinger

+0

एक 'डिक्शनरी' बिल्कुल वही था जो मुझे चाहिए, धन्यवाद! –

12

नहीं, आप एक अभिव्यक्ति के रूप में स्विच स्टेटमेंट का उपयोग नहीं कर सकते हैं। एक अन्य तरीका यह लिखने के लिए सशर्त ऑपरेटरों नीडिंत है:

var a = b == c ? d: 
     b == e ? f: 
       g; 
1

सं

एक switch बयान नियंत्रण शाखाओं में उपलब्ध कराता है। यह एक ऐसा फ़ंक्शन नहीं है जो किसी चर के लिए असाइन किया जा सकता है।

6

सी # में यह संभव नहीं है।

int a; 
switch(b) 
{ 
case c: 
    a = d; break; 
case e: 
    a = f; break; 
default: 
    a = g; break; 
}; 

क्या यह संभव है किसी भी अन्य भाषा में:

करीबी या तो एक विधि में इस ले जाने के लिए, या प्रत्येक मामले अलग-अलग में काम करते हैं, यानी हो सकता है?

हां। उदाहरण के लिए, अधिकांश कार्यात्मक भाषाएं समान कुछ का समर्थन करती हैं। उदाहरण के लिए, एफ # pattern matching इसका एक (अधिक शक्तिशाली) संस्करण प्रदान करता है।

6

यदि आप विशेष रूप से दक्षता के बारे में चिंतित नहीं थे, यह बहुत एक छोटे से वर्ग जेनरिक कि आप विधि का एक "धाराप्रवाह" श्रृंखला का उपयोग करने की अनुमति दी का उपयोग कर पकाने के लिए आसान होगा इस जैसे कॉल:

var a=Switch(b).Case(c).Then(d).Case(e).Then(f).Default(g); 

या, अगर आप चाहें, अधिक कॉम्पैक्ट

var a=Switch(b).Case(c, d).Case(e, f).Default(g); 

इस अपनी रुचि है, मैं सी # में एक उदाहरण

+1

वाह, यह वही है जो मैंने किया [यहां] (http://stackoverflow.com/questions/3334138/combine-return-and-switch/3334876#3334876) –

+2

ओह, यह मीठा है !!! –

+0

... हालांकि मुझे लगता है कि आपके कार्यान्वयन को सरल बनाया जा सकता है ... आप इसे अपरिवर्तनीय डेटा संरचनाओं के साथ कर सकते हैं, और शब्दकोश को बनाए रखने की कोई आवश्यकता नहीं है। अगर आपको कोई फर्क नहीं पड़ता है तो मैं उस अन्य धागे पर टिप्पणी कर सकता हूं :-) –

3

switch अप पकाने के लिए खुशी होगी एक बयान है जिसमें "वापसी" मान नहीं है। आप एक "स्विच" अभिव्यक्ति में रुचि रखते हैं, तो आप इस तरह कोड के लिए थोड़ा धाराप्रवाह वर्ग है कि मैं क्रम में here लिखा पा सकते हैं:

a = Switch.On(b) 
    .Case(c).Then(d) 
    .Case(e).Then(f) 
    .Default(g); 

आप एक कदम आगे जाना है और यह और भी अधिक सामान्यीकरण कर सकता है Then विधियों के लिए फ़ंक्शन पैरामीटर के साथ।

1

मैं वही चीज़ चाहता था क्योंकि मैं रूबी का बहुत उपयोग करता हूं, और यह आपको उस तरह की चीज करने की अनुमति देता है।तो मैंने FluentSwitch नामक एक नुजेट पैकेज बनाया।

+0

यह शानदार है, धन्यवाद! – vbullinger

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