2012-07-30 10 views
14

Supongamos que tengo una matriz llena de valores booleanos y quiero saber cuántos de los elementos son verdaderos.¿calcula el número de elementos verdaderos (o falsos) en una matriz bool?

private bool[] testArray = new bool[10] { true, false, true, true, false, true, true, true, false, false }; 

int CalculateValues(bool val) 
{ 
    return ??? 
} 

CalculateValues ​​debe devolver 6 si val es verdadero, o 4 si val es falso.

solución obvia:

int CalculateValues(bool val) 
{ 
    int count = 0; 
    for(int i = 0; i<testArray.Length;i++) 
    { 
     if(testArray[i] == val) 
      count++; 
    } 
    return count; 
} 

¿Hay una solución "elegante"?

Respuesta

27

Utilice LINQ. Usted puede hacer testArray.Where(c => c).Count(); para la cuenta verdadera o falsa para usar testArray.Where(c => !c).Count(); cheque

+4

Si bien es la misma idea, los siguientes respuestas utilizando el condicional de la sobrecarga de recuento son más limpios. –

33
return testArray.Count(c => c) 
11

se puede utilizar:

int CalculateValues(bool val) 
{ 
    return testArray.Count(c => c == val); 
} 

Este se encarga de la true y false cheques, en base a su parámetro val.

2

intentar algo como esto:

bool[] testArray = new bool[10] { true, false, true, true, false, true, true, true, false, false }; 
bool inVal = true; 
int i; 

i = testArray.Count(ai => ai == inVal); 
-2

me gusta esto:

int trueCount = boolArray.Sum(x => x ? 1 : 0) ; 
+1

¿Por qué reutilizar 'Suma' para realizar la función de' Cuenta'? – Richard

+0

Porque es más simple, más conciso y al grano. Si te gusta 'Where()'/'Count()', obtienes los mismos resultados a expensas de una llamada de método adicional por elemento de matriz. –

+1

Yo diría 'int trueCount = boolArray.Count (x => x)' es mucho más conciso y al punto – Richard

1

Mientras testArray.Count(c => c) es funcionalmente correcto, no es intuitiva y hay un riesgo de que algún desarrollador después se tira hacia fuera la parte c => c pensando que no hace nada.

Esto puede ser derisked declarando la función lambda por separado con un nombre significativo:

Func<bool, bool> ifTrue = x => x; 
return testArray.Count(ifTrue); 
Cuestiones relacionadas