2012-07-30 15 views
14

Załóżmy, że mam tablicę wypełnioną wartościami typu Boolean i chcę wiedzieć, ile elementów jest prawdą.obliczyć liczbę prawdziwych (lub fałszywych) elementów w tablicy bool?

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

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

CalculateValues ​​powinno zwrócić 6, jeśli wartość jest prawdą, lub 4, jeśli val jest fałszywe.

oczywiste rozwiązanie:

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

Czy istnieje "eleganckie" rozwiązanie?

Odpowiedz

27

Użyj LINQ. Można zrobić testArray.Where(c => c).Count(); prawdziwej liczby lub użyj testArray.Where(c => !c).Count(); dla fałszywego czeku

+4

Mimo to ten sam pomysł, poniższe odpowiedzi zastosowaniem warunkowego przeciążenie liczby są czystsze. –

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

można użyć:

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

ten obsługuje true i false kontrole, oparte na parametrze val.

2

spróbować czegoś takiego:

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

Lubię to:

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

Po co przekierowywać 'Sum', aby wykonać funkcję' Count'? – Richard

+0

Ponieważ jest to prostsze, bardziej zwięzłe i na temat. Jeśli podoba Ci się 'Where()'/'Count()', otrzymasz te same wyniki kosztem dodatkowego wywołania metody na element tablicy. –

+1

Powiedziałbym, że 'int trueCount = boolArray.Count (x => x)' jest dużo bardziej zwięzły i do punktu – Richard

1

Podczas testArray.Count(c => c) jest funkcjonalnie poprawny, to nie jest intuicyjny i istnieje ryzyko, że niektóre później deweloper będzie rozebrać się z c => c udział myśląc, że nic nie robi.

Można derisked deklarując funkcję lambda oddzielnie ze znaczącą nazwę:

Func<bool, bool> ifTrue = x => x; 
return testArray.Count(ifTrue); 
Powiązane problemy