如何使用LINQ计算与条件匹配的元素数

我尝试了很多东西,但对我来说最符合逻辑的是这个:

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

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

我在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 ,带有Count TakeWhile将返回2而不是预期的3。

Take的参数需要一个int ,你传递一个delegate / lambda表达式。 Take旨在获取元素的第一个count

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

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

不要吻

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

尝试

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