2013-04-09 96 views
8

我的代碼(C#)上有3個布爾值,而int32屬性取決於哪些布爾值是truefalse。 最新最好的方式做到這一點的另一種方式比if語句,如:在C#語句中檢查多個布爾條件的最佳方法

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

編輯:3個布爾必須讓每一個組合可以設置Int32值。

編輯2:對於兩個不同的布爾比較,「d」的值可以相同。

+4

如果總是恰好有三個布爾值,你可以建一個表時間提前,然後只是仰望使用布爾值作爲鍵的具體項目。 – cdhowie 2013-04-09 14:44:52

+0

整數數組,然後3個布爾值作爲單個位來索引正確的條目。一種二叉樹的緊湊表示。 – 2013-04-09 14:46:29

+0

致編輯:我的答案顯示如何從組成條件計算「組合指數」 – sehe 2013-04-09 14:53:36

回答

25

這是更好地捕捉操作的意圖,而不是明確檢查布爾值。

例如:

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

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

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

+1強烈同意,以最緊湊的方式檢查條件,我們不應該忘記該域。 – 2013-04-09 14:48:41

+0

也在這裏。我仍然發佈我的答案,因爲從OP不清楚他的情況適合'描述性域名' – sehe 2013-04-09 14:52:37

+1

如果他想使簡潔的代碼這種打敗目的 – SamFisher83 2013-04-09 14:53:50

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]; 

編輯問題的編輯使這個無關緊要: d是什麼意思?

如果它是假值的數(從示例代碼可能),使其

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

2

我想現在你做的事情是完全沒有任何其他的解決方案將降低到偏愛。

我的偏好,它適用的地方是如果可能的話將檢查分開。

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

這將是你需要發佈一個功能,如用戶是否登錄,如果參數存在,並且是在正確的背景下,與其他物品一起前檢查一定prereqs事件是有用的。

就像我說的,這可能不適用,但我只是想表達我的意見

0

我看不出有什麼錯你怎麼做,但如果輸出是相同的您可以通過創建真值表並簡化條件來簡化的多個條件,從而可以簡化

例如,如果d0隨時a是假的,你可以簡化爲:

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

或者,如果有一些數學模式(例如abc代表的三位數一個二進制數),那麼你可以做點算術。

但是,如果你有8個不同結果(一個爲ab每個組合,與c),那麼你的方法是好的。

9

您可以使用卡諾圖來減少方程,並減少ifs。

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

+0

這是我感到震驚的最佳解決方案,因此許多人沒有提出這個建議。 – 2013-04-09 15:23:37

+1

@Rhhound很多人只是喜歡寫邏輯,因爲它出現了,而不是它如何有效地結合,最終; K-maps只關注結果,並且無情地消除來自輸入的任何不會影響結果的信息。因此,這些信息從源頭上不再明顯。海恩,源不再是功能需求的反映。它是_harder_證明是正確的,而不是_easier_。更難維護(修改)。相反,通常你應該讓編譯器擔心優化(即使在內聯之後也可能發生)。 – sehe 2013-11-04 22:08:50