2013-04-09 13 views
8

पर एकाधिक बूलियन स्थितियों की जांच करने का सबसे अच्छा तरीका मेरे पास मेरे कोड (सी #) और int32 संपत्ति पर 3 बूलियन हैं जो कि बूलियन true और false पर निर्भर करता है। सबसे अच्छा तरीका है किसी अन्य तरीके से यह पूरा करने के क्या करता है, तो से बयान की तरह:कथन

if(a && b && !c) 
    d = 1; 
if(a && !b && !c) 
    d = 2; 
//etc.. ect... 

संपादित: 3 बूलियन्स int32 मान सेट करने के हर संभव संयोजन होना आवश्यक है।

संपादित करें 2: "डी" का मान दो अलग-अलग बूलियन तुलनाओं के लिए समान हो सकता है।

+4

तो वहाँ हमेशा ठीक तीन बूलियन्स हैं, तो आप समय से आगे है और फिर एक तालिका बना सकते हैं सिर्फ विशिष्ट आइटम कुंजी के रूप में बूलियन्स का उपयोग करके खोजने। – cdhowie

+0

पूर्ण प्रविष्टियों को अनुक्रमणित करने के लिए पूर्णांक की एक सरणी और फिर 3 बूलियन एकल बिट्स के रूप में उपयोग की जाती हैं। एक बाइनरी पेड़ के कॉम्पैक्ट प्रतिनिधित्व की तरह। –

+0

संपादित करने के लिए: मेरा उत्तर दिखाता है कि घटक परिस्थितियों से 'संयोजन सूचकांक' की गणना कैसे करें – sehe

उत्तर

25

यह आपरेशन के इरादे पर कब्जा करने के बजाय स्पष्ट रूप से बूलियन मूल्यों की जाँच के लिए बेहतर है ।

उदाहरण के लिए:

public void Check() 
{ 
    if (HasOrdered()) 
    { 
     // do logic 
    } 
} 

private bool HasOrdered() 
{ 
    return a && !b && !c; 
} 

private bool HasBooked() 
{ 
    return a && b && !c; 
} 
+0

+1 दृढ़ता से सहमत हैं, जो भी शर्तों को जांचने का सबसे कॉम्पैक्ट तरीका है, हमें डोमेन को नहीं भूलना चाहिए। –

+0

यहां +1 भी। मैंने अभी भी अपना जवाब पोस्ट किया है क्योंकि यह ओपी से स्पष्ट नहीं है कि उसका परिदृश्य खुद को 'वर्णनात्मक डोमेन नाम' – sehe

+1

के लिए उधार देता है यदि वह इस तरह के पराजय को – SamFisher83

2

आप लुकअप तालिका संकेत @Adriano द्वारा दिए गए कर सकता है, यह मानते हुए आप lookup_table सूचकांक के लिए मूल्यों से भर दिया है [0..8):

var index = new [] { a,b,c }.Aggregate(0, (a,i) => return 2*a + (i?1:0)); 

int d = lookup_table[index]; 

संपादित सवाल का संपादित करें इस अप्रासंगिक बना दिया: डी मतलब क्या है?

यदि यह बात गलत मूल्यों की गणना (नमूना कोड से संभव) है, यह

int d = new [] { a,b,c }.Count(b => !b); 

2

मुझे लगता है कि अपने अब कर बिल्कुल ठीक है और किसी भी अन्य समाधान पसंद के नीचे होगा।

मेरी प्राथमिकता, जहां यह लागू होती है, यदि संभव हो तो चेक को अलग करना होगा।

if (!a) 
    return; 
if (!b) 
    return; 
if (!c) 
    return; 

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

जैसा कि मैंने कहा इस पर लागू नहीं हो सकता है, लेकिन मैं सिर्फ मेरी राय आवाज चाहता था

0

मैं तुम्हें यह कैसे करते हैं उसमें कुछ भी गलत नहीं दिख रहा है, लेकिन अगर उत्पादन के लिए एक ही है कई स्थितियों में सच्ची तालिका बनाकर और शर्तों को सरल बनाकर सरल बनाने में सक्षम हो सकते हैं।

उदाहरण के लिए, यदि d होना चाहिए 0कभी भीa गलत है आप के लिए आसान बनाने में कर सकते हैं:

if(a) 
    if(b && !c) 
     d = 1; 
    if(!b && !c) 
     d = 2; 
    ... 
else 
    d = 0; 

या अगर वहाँ कुछ गणितीय पैटर्न है (उदाहरण के लिए a, b, और c के तीन अंक का प्रतिनिधित्व एक बाइनरी संख्या) तो आप थोड़ा अंकगणित कर सकते हैं।

अगर, हालांकि, आप 8 अलग परिणामों (a, b के प्रत्येक संयोजन के लिए, और c) हैं तो आपकी विधि ठीक है।

9

आप अपने समीकरणों को कम करने और कम ifs के लिए एक कर्णघ मानचित्र का उपयोग कर सकते हैं।

https://en.wikipedia.org/wiki/Karnaugh_map

+0

यह सबसे अच्छा समाधान है जो मुझे चौंकाने वाला है, इसलिए बहुत से लोगों ने इसका सुझाव नहीं दिया। –

+1

@ रैमहाउंड कई लोग तर्क को लिखना पसंद करेंगे _as यह arises_, यह नहीं कि यह कैसे प्रभावी ढंग से जोड़ता है, अंततः; के-मानचित्र परिणाम _only_ पर ध्यान केंद्रित करते हैं और इनपुट से किसी भी जानकारी को क्रूरता से खत्म करते हैं जो परिणाम को प्रभावित नहीं करता है। इसलिए यह जानकारी स्रोत से अब स्पष्ट नहीं है। हेन, स्रोत अब कार्यात्मक आवश्यकताओं का प्रतिबिंब नहीं है। यह सही साबित करने के लिए _harder_ है, _easier_ नहीं। बनाए रखने के लिए भी कठिन (संशोधित)। इसके बजाए, आमतौर पर आपको संकलक को अनुकूलन के बारे में चिंता करने देना चाहिए (जो इनलाइनिंग के बाद भी हो सकता है)। – sehe