Как подсчитать количество элементов, которые соответствуют условию с LINQ

Я пробовал много вещей, но самый логичный для меня выглядит следующим образом:

int divisor = AllMyControls.Take(p => p.IsActiveUserControlChecked == true).Count();

AllMyControls - это коллекция UserControls, я хочу знать, сколько UserControls имеет свойство IsActiveUserControlChecked, установленное в true.

Что я получаю в VS:

Cannot convert lambda expression to type 'int' because it is not a delegate type

Что не так с моим выражением?

Ответ 1

int divisor = AllMyControls.Where(p => p.IsActiveUserControlChecked).Count()

или просто

int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);

Поскольку вы новичок, было бы полезно взглянуть на Enumerable документация

Ответ 2

Почему бы прямо не использовать Count? Это утверждение == true также очень избыточно.

int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);

Кроме того, вы получаете сообщение об ошибке Take, потому что он ждет int. Вам нужно указать количество смежных элементов с начала коллекции, которую вы хотите получить, вы не можете поместить лямбда-выражение. Для этого вам нужно использовать TakeWhile. Итак,

int divisor = AllMyControls.TakeWhile(p => p.IsActiveUserControlChecked == true).Count();

был бы правильным, но не работал бы так, как вы ожидаете; он останавливается, как только состояние прерывается. Поэтому, если AllMyControls содержит true, true, false, true, TakeWhile с Count вернет 2 вместо ожидаемых 3.

Ответ 3

Не KISS

int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);

Ответ 4

Параметр для Take requres a int и вы передаете выражение делегата/лямбда. Take предназначен для того, чтобы просто взять первый count элементов.

Вы можете использовать метод count и передать делегат, чтобы подсчитать элементы, соответствующие его критериям. Таким образом, вы только повторяете IEnumerable один раз, вместо того, чтобы сначала отбирать те, которые не соответствуют вашим критериям, а затем снова, чтобы их действительно считать.

AllMyControls.Count(p => p.IsActiveUserControlChecked);

Ответ 5

Try

int divisor = AllMyControls.Where(x => x.IsActiveUserControlChecked == true).Count();