2012-09-07 6 views
23

Ho scritto un codice in AS3 che mi ha permesso di verificare se un determinato numero di cose fosse vero ...booleani aggiunta (come intero)

If (true + false + true + true + false + true + true < 4) 
{ 

} 

quando ho provato la riscrittura in C#, mi dice che non posso aggiungi il tipo bool e bool. Il modo migliore per farlo è riscriverlo in questo modo? O c'è un lavoro più semplice in giro?

If ((true?1:0) + (false?1:0) + (true?1:0) + (true?1:0) + (false?1:0) + (true?1:0) + (true?1:0) < 4) 
{ 

} 
+2

'public int ToInt (bool b) {return B? 1: 0;} ' –

+0

@ L.B:' ToInt' esiste come 'Convert.ToInt32' – porges

+0

http: // stackoverflow.it/questions/377990/elegantly-determin-if-more-than-one-boolean-is-true –

risposta

47

Prova utilizzando IEnumerable<T>.Count(Func<T,bool>) da System.Linq, con T come bool, su un params parametro metodo.

public static int CountTrue(params bool[] args) 
{ 
    return args.Count(t => t); 
} 

Uso

// The count will be 3 
int count = CountTrue(false, true, false, true, true); 

È anche possibile introdurre un metodo this estensione:

public static int TrueCount(this bool[] array) 
{ 
    return array.Count(t => t); 
} 

Uso

// The count will be 3 
int count = new bool[] { false, true, false, true, true }.TrueCount(); 
+1

Bello! Codice molto pulito ed elegante! – Mithrandir

+1

È bellissimo: ') Grazie, questo è proprio quello che userò! – Randomman159

+3

+1 Sì, bella idea usando 'params' – sloth

13

Si potrebbe creare un array e utilizzare Count:

if ((new []{true, false, true, true, false, true, true}).Count(x=>x) < 4) 
{ 

} 

o il metodo Sum:

if ((new []{true, false, true, true, false, true, true}).Sum(x=>x?1:0) < 4) 
{ 

} 
+0

Se lo stavo usando come one off, questo è come lo farei, grazie heap per rispondere * upvotes * – Randomman159

+0

Grazie! Questo era il mio approccio preferito. Ho avuto alcuni bool che dovevo aggiungere in questo modo e (nuovo [] {var1, var2, var3, var4}). Sum (x => x? 1: 0); ha funzionato alla grande per me! – statue

1

Convert.ToInt32(true) + Convert.ToInt32(false) + Convert.ToInt32(true) lavorare anche in questo caso penso che questo è il modo più semplice che abbiamo

+0

che cosa stai scherzando su di esso –

11

Ecco un esempio più divertente:

if ((BoolCount)true + false + true + true + false + true + true <= 5) 
{ 
    Console.WriteLine("yay"); 
} 

Utilizzando questa classe:

struct BoolCount 
{ 
    private readonly int c; 
    private BoolCount(int c) { this.c = c; } 

    public static implicit operator BoolCount(bool b) 
     { return new BoolCount(Convert.ToInt32(b)); } 

    public static implicit operator int(BoolCount me) 
     { return me.c; } 

    public static BoolCount operator +(BoolCount me, BoolCount other) 
     { return new BoolCount(me.c + other.c); } 
} 
+1

Ha! Totalmente divertente, davvero! +1 – sloth

0

(Ispirato da LB : s commento) è possibile scrivere un metodo di estensione:

static class Ex 
{ 
    public static int Int(this bool x) { return x ? 1 : 0; } 
} 

E poi (a condizione di includere un using allo spazio dei nomi che contiene la classe Ex), è possibile scrivere la vostra dichiarazione if in questo modo:

if (true.Int() + false.Int() + true.Int() + true.Int() + 
    false.Int() + true.Int() + true.Int() < 4) 
{ 
    ... 
} 
0

si potrebbe scrivere un metodo di estensione per la classe BitArray. Non sono sicuro se la prestazione sarebbe di meglio che usare LINQ, ma almeno la sua un'altra opzione:

public static int CountSetBits(this BitArray theBitArray) 
{ 
    int count = 0; 
    for (int i = 0; i < theBitArray.Count; i++) 
    { 
     count += (theBitArray.Get(i)) ? 1 : 0; 
    } 
    return count; 
} 

Usage:

BitArray barray = new BitArray(new [] { true, true, false, true }); 
int count = barray.CountSetBits(); // Will return 3