2013-04-09 18 views
8

私のコード(C#)には3個のブール値があり、ブール値はtruefalseであるint32というプロパティがあります。C#if文で複数のブール条件をチェックする最良の方法

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

EDIT:3つのブールがint32の値を設定するために可能なあらゆる組み合わせを持っている必要がありますようにif文よりも、別の方法でこれを達成する いただきまし最良の方法。

編集2: "d"の値は、2つの異なるブール比較で同じにすることができます。

+4

3つのブール値が正確に常に存在している場合は、事前にテーブルを作成してからちょうどキーとしてブール値を使用して特定の項目を検索することができます。 – 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こちらも。私は彼のシナリオが '説明的なドメイン名'のために役立つことはOPからはっきりしていないので私の答えはまだ投稿しています – sehe

+1

彼がこの種の簡潔なコードを作って目的を敗北させたい場合は – SamFisher83

2

あなたはlookup_tableインデックスの値で満たされていると仮定すると、@Adrianoによって与えられたルックアップテーブルヒントを行うことができます[0..8):

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

int d = lookup_table[index]; 

編集質問のEDITこれは無関係です: dはどういう意味ですか?

それが(サンプルコードから可能)偽値のカウントなら、それ

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; 

または一部の数学的なパターンが存在する場合(例えばabは、とcは、の3つの数字を表し2進数)、ビット演算を行うことができます。しかし、あなたは8つの明確な成果(abの組み合わせごとに1、およびc)をお持ちの場合

は、あなたの方法で結構です。

9

あなたは方程式を減らし、ifsを少なくするためにカルノーマップを使うことができます。

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

+0

これは私がショックを受けた最高の解決策です。 –

+1

@Ramhound多くの人々は、論理的には論理的に書くことを好みます。 K-mapは結果に焦点を当て、結果に影響を与えない入力から情報を無用に排除します。したがって、この情報はソースからはもはや明らかではありません。 Hene、ソースはもはや機能要件の反映ではありません。それは_harder_ではなく、正しいことを証明することではなく、_easier_です。維持(変更)するのがさらに難しい。代わりに、通常、コンパイラに最適化について心配する必要があります(これはインライン展開後にも発生する可能性があります)。 – sehe

関連する問題