Ответ 1
Используйте LINQ. Вы можете сделать testArray.Where(c => c).Count();
для истинного подсчета или использовать testArray.Where(c => !c).Count();
для ложной проверки
Предположим, что у меня есть массив, заполненный булевыми значениями, и я хочу знать, сколько из них истинно.
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;
}
Есть ли "элегантное" решение?
Используйте LINQ. Вы можете сделать testArray.Where(c => c).Count();
для истинного подсчета или использовать testArray.Where(c => !c).Count();
для ложной проверки
return testArray.Count(c => c)
Вы можете использовать:
int CalculateValues(bool val)
{
return testArray.Count(c => c == val);
}
Это обрабатывает проверки true
и false
на основе вашего параметра val
.
Попробуйте что-то вроде этого:
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);
В то время как testArray.Count(c => c)
функционально корректен, он не интуитивно понятен и существует риск того, что какой-нибудь более поздний разработчик разделит часть c => c
, думая, что ничего не делает.
Это можно обмануть, объявив лямбда-функцию отдельно значимым именем:
Func<bool, bool> ifTrue = x => x;
return testArray.Count(ifTrue);
Мне это нравится:
int trueCount = boolArray.Sum( x => x ? 1 : 0 ) ;