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

时间:2013-06-21 20:46:14

标签: c# linq count

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

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

我的表情有什么问题?

5 个答案:

答案 0 :(得分:50)

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

或只是

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

既然你是初学者,那么值得一看Enumerable文档

答案 1 :(得分:5)

为什么不直接使用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, trueTakeWhile Count将返回2而不是预期的3。

答案 2 :(得分:1)

不要KISS

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

尝试

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