2012-11-19 4 views
5

मैं जैसे ही विस्तार विधि बनाया है ..जांच करें कि विशेष रूप से केवल इन झंडे गणन में सेट

public static bool AllFlagsSet<T>(this T input, params T[] values) where T : struct, IConvertible 
{ 
    bool allSet = true; 
    int enumVal = input.ToInt32(null); 

    foreach (T itm in values) 
    { 
     int val = itm.ToInt32(null); 
     if (!((enumVal & val) == val)) 
     { 
      allSet = false; 
      break; 
     } 
    } 

    return allSet; 
} 

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

असल में ऐसा कुछ।

public static bool OnlyTheseFlagsSet<T>(this T input, params T[] values) where T : struct, IConvertible 
{ 
} 

एक ही रास्ता मैं यह कर के बारे में सोच सकते हैं सभी उपलब्ध गणन मूल्यों की जांच करने के लिए सेट कर रहे हैं हो रही है और इस बात की पुष्टि है कि केवल दो प्रदान की गई है कर रहा है।

क्या किसी प्रकार का bitwise ऑपरेशन का उपयोग करके इस समस्या को हल करने का कोई और तरीका है?

+0

यह एक होमवर्क है ?? और एक संरचना के लिए टी बाधा क्यों है और एक enum नहीं ?? – LightStriker

+0

लॉल, ठीक है कि यह शर्मनाक है। नहीं, अभी तक बिटवाई ऑपरेशंस की दृढ़ समझ नहीं है ... यह एक वास्तविक आवश्यकता है –

+0

इसे एनम पर बाध्य करने का प्रयास करें और देखें कि क्या होता है। ; -पी –

उत्तर

5

सभी आवश्यक झंडे पर "या" इनपुट करें और इनपुट के साथ तुलना करें - बराबर होना चाहिए। निम्नलिखित, सही पाश के साथ बाईं तरफ के मूल्य की गणना करने के लिए समान:

var onlyTheseFlagsSet = (value[0] | value[1]) == input; 
0

Am मैं कुछ कमी या कर सकता तुम सिर्फ योग टी [] मूल्यों पैरामीटर और देखें कि क्या इनपुट परिणाम के बराबर होती है न?
यदि आप केवल उन झंडे और अन्य लोगों को चाहते हैं, तो इनपुट उन झंडे के बराबर होना चाहिए।

+1

'+' के रूप में योग खतरनाक हो सकता है क्योंकि झंडे के प्रकारों के लिए भी एनम मूल्यों पर पारस्परिक रूप से अनन्य होना आवश्यक नहीं है - किसी को उपयोग करने की आवश्यकता है या झंडे को सही ढंग से गठबंधन करने के लिए। –

1

यह प्रत्येक इनपुट मान का थोड़ा सा फ़्लिप करता है। अगर केवल वे सेट हैं, तो परिणामी मान शून्य होगा। अन्यथा, यदि input में मान सेट नहीं किया गया है तो यह बिट्स को 1 पर फ़्लिप करेगा जो मान शून्य-शून्य छोड़ देगा।

public static bool OnlyTheseFlagsSet<T>(this T input, params T[] values) where T : struct, IConvertible 
{ 
    int enumVal = input.ToInt32(null); 

    foreach (T itm in values) 
    { 
     int val = itm.ToInt32(null); 
     enumVal = enumVal^val;     
    } 

    return (enumVal == 0); 
} 
+1

+1। मुझे '|' दृष्टिकोण पसंद है, लेकिन यह भी दिलचस्प है। साइड नोट - कृपया 'item' के बजाय' itm' जैसे shrtng nms f vrbls से बचें। –

+0

मुझे '|' दृष्टिकोण भी पसंद है। परिवर्तनीय नामों से सहमत, मैं सिर्फ मूल लेखक की शैली को रख रहा था। –

+0

साइड नोट: बस ध्यान दिया गया - आपका कोड पारस्परिक रूप से अनन्य मानों पर निर्भर करता है ... झंडे के रूप में चिह्नित एनम के मूल्यों के लिए भी सत्य की आवश्यकता नहीं है। –

0

आप एक enum करने के लिए अपने इनपुट में बदल सकते हैं मान लिया जाये:

foreach(MyFlags flag in values) 
    if (!input.HasFlag(flag)) 
     return false; 

return true; 

हाँ, मैं उस तरह आलसी हूँ।

+0

मुझे लगता है कि ओपी यह भी सुनिश्चित करना चाहता है कि अन्य झंडे सेट नहीं हैं ... ओपी की टिप्पणियों की प्रतीक्षा ... –

2

विशिष्टता आवश्यकता का मतलब है कि

input = values[0] | values[1] | ... | values[values.Length - 1]

तो, यहाँ दिया गया है:

return input.ToInt32(null) == values.Aggregate(0, 
     (total, next) => total | next.ToInt32(null)); 
+0

+1। वह '.ToInt32 (शून्य) 'अजीब लग रहा है, लेकिन फिर भी काम करता है! –

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