2015-12-11 9 views
6

Ho difficoltà a utilizzare la funzione array.All<>.Se tutti gli elementi dell'array bool sono veri?

private bool noBricksLeft() { 
    bool[] dead = new bool[brick.Length]; 

    for (int i = 0; i < brick.GetLength(0); i++) { 
     if (brickLocation[i, 2] == 0) 
      dead[i] = true; 
     else 
      continue; // move onto the next brick 
    } 

    if (dead.All(dead[] == true)) // IF ALL OF THE ELEMENTS ARE TRUE 
     return true; 
    else 
     return false; 
} 

Mi chiedo come posso raggiungere if (dead.All(dead[] == true))?

+2

È possibile utilizzare 'tornare dead.All (x => x);' –

risposta

11

si può semplicemente utilizzare un lambda-espressione:

if (dead.All(x => x)) 

dato using System.Linq s' IEnumerable<T>.All metodo.

farà il trucco. Inoltre, un if dichiarazione che restituisce la risposta è inutile, in modo da poter riscrivere a:

private bool noBricksLeft() { 
    bool[] dead = new bool[brick.Length]; 

    for (int i = 0; i < brick.GetLength(0); i++) { 
     if (brickLocation[i, 2] == 0) 
      dead[i] = true; 
     else 
      continue; //move onto the next brick 
    } 

    return dead.All(x => x); 
} 

Un'altra idea, in parte mutuata dalla @royhowie è la seguente:

private bool noBricksLeft() { 
    return Enumerable.Range(0,brick.Length).All(i => brickLocation[i,2] == 0); 
} 
+0

Grazie per l'aiuto :) – EnglischerZauberer

+1

La mancanza di un 'All' privo di predicati non è strano. 'Any (pred)' è vero se c'è almeno un elemento corrispondente e 'Any()' è vero se c'è almeno un elemento, falso altrimenti è essenzialmente 'Qualsiasi (x => true)',. 'All (pred)' è false se c'è almeno un elemento non corrispondente e quindi un 'All()' equivalente a 'All (x => true)' restituisce sempre true. –

+0

Hai ragione nel senso che "Qualsiasi()" senza argomenti significa che c'è almeno un elemento. È comunque un po '"problematico" perché per un elenco di valori booleani può essere un'interpretazione intuitiva, sia che un elemento sia 'true' (non se la lista contiene un elemento). In altre parole si potrebbe aver definito un 'Any' per IEnumerable '. E usa un * nome diverso * per indicare se esiste almeno un elemento. –

2

È possibile utilizzare return dead.All(x => x);

+1

@KevinWells: Penso che abbiamo risposto in modo concorrente. Quindi nessun problema Inoltre ho fatto un errore: il 'Any' è definito senza predicato mentre' All' non lo è. Quindi per qualche ragione pensavo che il 'All' non avesse bisogno di un predicato. –

+0

@KevinWells Se dai un'occhiata al tempo dei commenti, vedrai che ho postato il commento per primo, e se dai un'occhiata a quella risposta, vedrai che la prima modifica della risposta era usando dead.All(). Così ho deciso di postare la risposta :) –

+0

@RezaAghaei: fatto +1 btw, quindi nessun problema. –

5

Sì, è possibile utilizzare .All, ma il codice non è ancora molto bello. Da quanto ho capito, è possibile riscrivere il codice come questo, senza l'utilizzo di un array:

private bool noBricksLeft() { 
    for (int i = 0; i < brick.GetLength(0); i++) { 
     // inverted your condition; we can short-circuit 
     // and just return false 
     if (brickLocation[i, 2] != 0) 
      return false; 
    } 
    // every brick passed our condition, so return true 
    return true; 
} 
+2

Mentre le risposte del mio e di CommuSoft si concentrano sulla sintassi corretta dell'uso di tutti, la tua risposta è anche utile per guidare l'OP al modo corretto di scrivere il suo metodo. +1 alla tua risposta :) –

Problemi correlati