2013-06-21 97 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);