2010-04-02 16 views
5

निम्नलिखित झंडे को देखते हुए,सी # Enum झंडे तुलना

[Flags] 
    public enum Operations 
    { 
     add = 1, 
     subtract = 2, 
     multiply = 4, 
     divide = 8, 
     eval = 16, 
    } 

मैं एक अगर हालत प्रत्येक कार्रवाई करने के लिए कैसे लागू कर सकता है? मेरे प्रयास में, पहली स्थिति जोड़ने के लिए सच है, eval eval, जो सही है। हालांकि पहली स्थिति घटाने के लिए भी सच है, eval, जो गलत है।

 public double Evaluate(double input) 
    { 
     if ((operation & (Operations.add & Operations.eval)) == (Operations.add & Operations.eval)) 
      currentResult += input; 
     else if ((operation & (Operations.subtract & Operations.eval)) == (Operations.subtract & Operations.eval)) 
      currentResult -= input; 
     else 
      currentResult = input; 

     operation = null; 

     return currentResult; 
    } 

मैं नहीं देख सकता कि समस्या क्या है।

+1

क्या यह सिर्फ मुझे लगता है कि दिखाए गए ऑपरेशन के लिए [ध्वज] सही नहीं है? मैं एक असली दुनिया के नमूने के बारे में सोचने के लिए संघर्ष कर रहा हूं जहां मेरे पास गणितीय परिचालनों पर झंडे दिखाई देंगे ... – Sunny

+0

मैं सनी से सहमत हूं। झंडे को कैलकुलेटर में राज्यों का प्रतिनिधित्व करना था। मुझे यकीन नहीं है कि मैंने ऐसा क्यों किया। पीछे की ओर, मैं इसे आजकल ऐसा नहीं करूँगा। की –

+0

संभावित डुप्लिकेट [सी # में तुलना कैसे झंडे?] (http://stackoverflow.com/questions/40211/how-to-compare-flags-in-c) –

उत्तर

23
बदलें

अपने भीतर &| रहे हैं:

if(((operation & Operations.add)==Operations.add) && 
    ((operation & Operations.eval)==Operations.eval)) 

जो अधिक पठनीय हो सकता है:

if ((operation & (Operations.add | Operations.eval)) == (Operations.add | Operations.eval)) 

इस के बराबर है। आप भी इस तरह एक विस्तार पर विचार करना चाहते हो सकता है:

public static bool HasFlag(this Operations op, Operations checkflag) 
{ 
    return (op & checkflag)==checkflag; 
} 

तो आप ऐसा कर सकते हैं:

if(operation.HasFlag(Operations.add) && Operations.HasFlag(Operations.eval)) 

भी अधिक पठनीय हो सकता है। अंत में आप और भी अधिक मनोरंजन के लिए इस विस्तार बना सकते हैं:

public static bool HasAllFlags(this Operations op, params Operations[] checkflags) 
{ 
    foreach(Operations checkflag in checkflags) 
    { 
     if((op & checkflag)!=checkflag) 
      return false; 
    } 
    return true; 
} 

फिर अपने अभिव्यक्ति में बदल सकती है:

if(operation.HasAllFlags(Operations.add, Operations.eval)) 
+0

+1 महान जवाब! –

+0

आरंभिक सुझाव गलत है; अंतिम समाधान सही है;, जब तक आप इस पढ़ने योग्य नहीं लगता है) –

+0

आप अलग 'HasAllFlags' की जरूरत है, क्योंकि आप' HasFlag' इसलिए की तरह उपयोग कर सकते हैं करते हैं: 'अगर (operation.HasFlag (Operations.add | Operations.eval))'। – weston

1

कारण आपके ऑपरेशन विफल हो रहा है है, क्योंकि आप गलत अभिव्यक्ति की है। (Operations.add & Operations.eval)हमेशा शून्य है। आपकी पहली तुलना के बाएं और दाएं तरफ हमेशा शून्य होते हैं। इस के बजाय का प्रयास करें - मुझे लगता है यह आप क्या कर रहे थे के बाद बताया गया है:

public double Evaluate(double input) 
{ 
    if ((operation & (Operations.add | Operations.eval)) == (Operations.add | Operations.eval)) 
     currentResult += input; 
    else if ((operation & (Operations.subtract | Operations.eval)) == (Operations.subtract | Operations.eval)) 
     currentResult -= input; 
    else 
     currentResult = input; 

    operation = null; 

    return currentResult; 
} 
1

इस प्रयास करें:

public double Evaluate(double input) 
{ 
    if ((operation & (Operations.add | Operations.eval)) == (Operations.add | Operations.eval)) 
     currentResult += input; 
    else if ((operation & (Operations.subtract | Operations.eval)) == (Operations.subtract | Operations.eval)) 
     currentResult -= input; 
    else 
     currentResult = input; 

    operation = null; 

    return currentResult; 
} 
11

वाह, मैं गलत जवाब के सभी विश्वास नहीं कर सकता ..

करना अत्यंत आवश्यक है यदि आप झंडे के साथ काम कर रहे हैं तो bitwise गणित को समझें। तो

1 in binary is 00001 
16 in binary is 10000 

    00001 
& 10000 
-------- 
    00000 

, कहते हैं कि हमारे पास घटाना (2) operation

2 in binary is  00010 
previous result is 00000 

    00010 
& 00000 
-------- 
    00000 

पिछले परिणाम है के बाद से के रूप में 00000 कुछ भी और ': आपके मामले में, आपको निम्न (पहली शर्त के लिए) डी के साथ शून्य होगा। तो 0 == 0 के बाद से आपकी हालत हमेशा true पर मूल्यांकन करेगी।

हम सिर्फ या करने के लिए इस स्विच, तो हम निम्नलिखित है:

1 in binary is 00001 
16 in binary is 10000 

    00001 
| 10000 
-------- 
    10001 (17) 

अब, कहते हैं कि हम Add (1)operation

1 in binary is  00001 
previous result is 10001 (17) 

    00001 
& 10001 
-------- 
    00001 

तो जैसा कि, 1 & 17 => 1 और इस तरह अपने अंतिम है हालत (1 & (1 | 16)) == (1 | 16) =>1 & 17 == 17 =>1 == 17 =>false (अभी भी झूठी है!)

तो क्या आप वास्तव में चाहते हैं:

((operation | Operations.add | Operations.eval) & (Operations.add | Operations.eval)) == (Operations.add | Operations.eval) 

यह हो जाता है ((1 | 1 | 16) & (1 | 16)) == (1 | 16) =>(17 & 17) == 17 =>17 == 17 == true

यह स्पष्ट रूप से पढ़ने योग्य नहीं है, तो आप में इस निकालने के लिए चुनते चाहिए एक विधि (जैसा सुझाव दिया गया है)। लेकिन यह अभी भी महत्वपूर्ण है समझें कि क्यों आपकी स्थिति गलत है।