Вычислить количество истинных (или ложных) элементов в массиве bool?

Предположим, что у меня есть массив, заполненный булевыми значениями, и я хочу знать, сколько из них истинно.

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;
}

Есть ли "элегантное" решение?

Ответы

Ответ 1

Используйте LINQ. Вы можете сделать testArray.Where(c => c).Count(); для истинного подсчета или использовать testArray.Where(c => !c).Count(); для ложной проверки

Ответ 2

return testArray.Count(c => c)

Ответ 3

Вы можете использовать:

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

Это обрабатывает проверки true и false на основе вашего параметра val.

Ответ 4

Попробуйте что-то вроде этого:

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);

Ответ 5

В то время как testArray.Count(c => c) функционально корректен, он не интуитивно понятен и существует риск того, что какой-нибудь более поздний разработчик разделит часть c => c, думая, что ничего не делает.

Это можно обмануть, объявив лямбда-функцию отдельно значимым именем:

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

Ответ 6

Мне это нравится:

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