如何用LINQ计算符合条件的元素的数量

本文关键字:元素 条件 何用 LINQ 计算 | 更新日期: 2023-09-27 18:19:22

我尝试了很多方法,但对我来说最合乎逻辑的似乎是这个:

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

AllMyControlsUserControls的集合,我想知道的是有多少UserControlsIsActiveUserControlChecked属性设置为真。

我在VS中得到的是:

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

我的表情怎么了?

如何用LINQ计算符合条件的元素的数量

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

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

由于您是初学者,因此值得查看Enumerable文档

为什么不直接使用Count呢?== true语句也是高度冗余的。

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

同样,你在你的Take方法上得到一个错误,因为它正在等待一个int。您需要指定从要获取的集合开始的连续元素的数量,不能使用lambda表达式。你需要使用TakeWhile。所以

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

应该是正确的,但不会像你期望的那样工作;一旦条件被打破,它就会停止。因此,如果AllMyControls包含true, true, false, true, TakeWhileCount将返回2而不是您预期的3。

Take的参数需要一个int,并且您正在传递一个委托/lambda表达式。Take只取元素的第一个count

您可以使用Count方法并传入一个委托来计算符合其标准的元素。这样,您只需迭代IEnumerable一次,而不是先剔除不符合条件的元素,然后再对它们进行计数。

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

请勿KISS

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

Try

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