如何用LINQ计算符合条件的元素的数量
本文关键字:元素 条件 何用 LINQ 计算 | 更新日期: 2023-09-27 18:19:22
我尝试了很多方法,但对我来说最合乎逻辑的似乎是这个:
int divisor = AllMyControls.Take(p => p.IsActiveUserControlChecked).Count();
AllMyControls
是UserControls
的集合,我想知道的是有多少UserControls
的IsActiveUserControlChecked
属性设置为真。
我在VS中得到的是:
Cannot convert lambda expression to type 'int' because it is not a delegate type
我的表情怎么了?
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
, TakeWhile
与Count
将返回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();