2013-06-21 99 views
12
条件

我已经试过了很多东西,但最合理的一个对我来说元素的数量似乎这一个:如何计算匹配LINQ

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

AllMyControlsUserControls集合,是什么我想知道UserControls有多少个IsActiveUserControlChecked属性设置为true。

我在VS得到的是:

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

这有什么错我的表情?

回答

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

或者干脆

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

既然你是一个初学者,这将是值得看一看Enumerable文档

+1

哇,那个速度..谢谢!很明显,我是Linq的新手.. – Sturm

+6

更简单:D' int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);' – keyboardP

+2

@keyboardP我在评论前添加了这个答案,但是感谢输入:) –

0

尝试

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

不要KISS

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

为什么不直接使用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, trueTakeWhileCount将返回,而不是2您预计3

+0

是的,实际上在我的代码中它必须是!= true,为了清晰起见,我喜欢这一点。感谢您的建议 – Sturm

+0

@Sturm哦,那你可以写'!p.IsActiveUserControlChecked',而不是'!= TRUE'或'== FALSE' –

1

Take参数requres的int和你传递一个委托/ lambda表达式。 Take只是设计了第一个count的元素。

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

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