2013-04-09 10 views
8

ifadelerinde 3 kodun benim kodumda (C#) ve booleanların true ve false ne olduğuna bağlı olarak int32 özelliği var. iyi yolu ifadeleri isterseniz daha farklı bir şekilde bunu yapmanın nedir:C# içinde birden fazla boole durumu olup olmadığını kontrol etmenin en iyi yolu

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

EDIT: 3 mantıksal ifadenin int32 değerini ayarlamak için mümkün olan her kombinasyonu olmalıdır.

DÜZEN 2: "d" değeri, iki farklı boole karşılaştırması için aynı olabilir.

+4

tam üç mantıksal ifadenin her zaman varsa, vaktinden önce ve sonra bir tablo oluşturmak sadece tuşları olarak Bağlaçlar ile belirli öğeyi aramak olabilir. – cdhowie

+0

Bir dizi tam sayı ve daha sonra 3 boole, uygun girişi dizine eklemek için tek bit olarak kullanılır. İkili bir ağacın kompakt gösterimi. –

+0

DÜZENLEME'ye: cevabım, kurucu koşullardan bir 'kombinasyon dizini' nasıl hesaplanacağını gösterir – sehe

cevap

25

operasyonun amacını yakalamak yerine açıkça boole değerlerini kontrol etmek daha iyidir . Örneğin

:

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

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

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

+1 Koşulları unutmamamız gereken koşulları kontrol etmek için en kompakt yol hangisi olursa olsun, kesinlikle katılıyorum. –

+0

+1 burada da. Ben hala cevabımı yayınladı çünkü OP'den açıkça anlaşılamayan senaryosunun kendisini 'tanımlayıcı alan adı' için kullandığı ' – sehe

+1

Eğer bu kodları tersine çevirmek istiyorsa bu tür bir yenilgi – SamFisher83

2

Sen lookup_table indeksi değerleri ile dolu olduğu varsayılarak, @Adriano tarafından verilen arama tablosu ipucu yapabileceği [0..8):

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

int d = lookup_table[index]; 

Düzenleme soru DÜZENLEME Bu konuyla alakasız: Ne demek? o (örnek koddan mümkün) yanlış değerler sayımı ise

yapmak o

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

2

Ben senin şimdi yapıyor gayet olumlu ve başka çözümler aşağı tercihi olacağını düşünüyoruz.

Tercihlerim, geçerli olduğu durumlarda, çekleri mümkünse ayırmak olacaktır.

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

Bu, bir parametrenin var ve diğer öğelerle birlikte, doğru bağlamda ise kullanıcı, oturum açıp açmadığını gibi bir işlevi vermeden önce belirli bir önkoşul kontrol etmek gerekir durumunda faydalı olacaktır. Dediğim gibi

bu geçerli olmayabilir ama sadece benim düşüncem sesli istediği çıkışı için aynı olup olmadığını bunu yaparsınız nasıl bir şey yanlış görüyorum ama yok

0

Birden çok koşulda bir doğruluk tablosu oluşturarak ve koşulları basitleştirerek basitleştirebilirsiniz.

Örneğin, d eğer 0zamana size basitleştirmek olabilir yanlıştır olmalıdır:

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

Veya bazı matematiksel model varsa (örneğin a, b ve c üç basamak temsil bir ikili sayı) sonra biraz aritmetik yapabilirdiniz.Ancak, 8 ayrı sonuçları (a, b her kombinasyonu için bir tane ve c) varsa

sonra yöntem gayet iyi.

9

Denklemlerinizi azaltmak ve daha az ipucu almak için bir Karnaugh haritası kullanabilirsiniz.

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

+0

Bu kadar çok insan bunu önermedim şok oldum en iyi çözümdür. –

+1

@Ramhound birçok kişi basitçe, mantıksal olarak yazmayı tercih edecektir. K-haritaları sonuca odaklanır _only_ ve sonucu artık etkilemeyen herhangi bir bilgiyi acımasızca ortadan kaldırır. Bu nedenle, bu bilgi artık kaynaktan açık değildir. Hene, kaynak artık fonksiyonel gereksinimlerin bir yansıması değil. Doğru olduğunu kanıtlamak için _harder_, _easier_ değil. Korumak (değiştirmek) daha da zor. Bunun yerine, genellikle derleyicinin en iyi duruma getirme konusunda endişelenmesine izin vermelisiniz (bu, inline sonra bile olabilir). – sehe