2012-07-30 142 views
14

假設我有一個用布爾值填充的數組,我想知道有多少元素是真的。計算布爾數組中真(或假)元素的數量?

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

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

CalculateValues應該返回6如果val是真實的,或4如果val是假的。

明顯的解決方案:

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

是否有一個 「優雅」 的解決方案?

回答

27

使用LINQ。您可以爲真正的計數做testArray.Where(c => c).Count();或使用testArray.Where(c => !c).Count();假支票

+4

雖然這是同樣的想法,下面的答案使用計數的條件超載的清潔劑。 – 2012-08-02 16:08:37

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

您可以使用:

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

此處理truefalse檢查,根據您val參數。

2

嘗試這樣:

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

我喜歡這樣的:

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

爲什麼重新調整'Sum'來執行'Count'的功能? – Richard 2012-07-31 08:10:55

+0

因爲它更簡單,更簡潔,重點突出。如果你喜歡'Where()'/'Count()',你會得到相同的結果,但是每個數組元素需要額外的方法調用。 – 2012-07-31 16:40:50

+1

我會說'int trueCount = boolArray.Count(x => x)'更加簡潔並且對於點 – Richard 2012-07-31 16:48:48

1

雖然testArray.Count(c => c)在功能上是正確的,這是不直觀,並有一個風險,即一些後來開發商將剝離出的c => c部分認爲它什麼都不做。

這可以通過一個有意義的名稱分別宣佈拉姆達功能derisked:

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