Как подсчитать количество элементов, которые соответствуют условию с 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();