26

假设我有一个充满布尔值的数组,我想知道有多少元素是真的。

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

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

如果 val 为真,CalculateValues 应返回 6,如果 val 为假,则应返回 4。

明显的解决方案:

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

有没有“优雅”的解决方案?

4

6 回答 6

50
return testArray.Count(c => c)
于 2012-07-30T23:04:45.277 回答
38

使用 LINQ。您可以testArray.Where(c => c).Count();进行真实计数或testArray.Where(c => !c).Count();用于错误检查

于 2012-07-30T23:02:14.717 回答
15

您可以使用:

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

这将根据您的参数 处理true和检查。falseval

于 2012-07-30T23:06:08.790 回答
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);
于 2012-07-30T23:08:17.883 回答
2

虽然testArray.Count(c => c)在功能上是正确的,但它并不直观,并且存在一些后来的开发人员会c => c认为它没有做任何事情的风险。

这可以通过使用有意义的名称单独声明 lambda 函数来消除风险:

Func<bool, bool> ifTrue = x => x;
return testArray.Count(ifTrue);
于 2015-10-21T11:02:59.037 回答
-2

我喜欢这个:

int trueCount = boolArray.Sum( x  => x ? 1 : 0 ) ;
于 2012-07-31T00:11:44.033 回答