2013-06-21 8 views
12

Ho provato un sacco di cose, ma quello più logico per me sembra questo:come contare il numero di elementi che corrispondono una condizione con LINQ

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

AllMyControls è una raccolta di UserControls, cosa Voglio sapere quantiproprietà è impostata su true.

cosa ottengo in VS è:

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

Cosa c'è di sbagliato con la mia espressione?

risposta

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

o semplicemente

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

Dato che sei un principiante, varrebbe la pena di dare un'occhiata al Enumerable documentazione

+1

Wow, quella velocità .. Grazie! È ovvio che sono nuovo con Linq .. – Sturm

+6

Ancora più semplice: D 'int divisore = AllMyControls.Count (p => p.IsActiveUserControlChecked);' – keyboardP

+2

@keyboardP Ho aggiunto questo alla risposta prima del tuo commento, ma grazie per l'input :) –

0

Prova

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

Non KISS

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

Perché non utilizzare direttamente Count? Anche l'istruzione == true è altamente ridondante.

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

Inoltre, si stanno ottenendo un errore del metodo Take perché è in attesa di un int. È necessario specificare il numero di elementi contigui dall'inizio della raccolta che si desidera ottenere, non è possibile inserire un'espressione lambda. È necessario utilizzare TakeWhile per quello. Così

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

sarebbe stato corretto, ma non avrebbe funzionato il modo in cui ci si aspetta; si ferma una volta che la condizione è stata interrotta. Quindi, se AllMyControls contiene true, true, false, true, TakeWhile con Count tornerà 2 al posto del tuo previsto 3.

+0

Sì, in realtà nel mio codice deve essere! = true, e mi piace per chiarezza. Grazie per il suggerimento – Sturm

+0

@Sturm Oh, quindi puoi scrivere '! P.IsActiveUserControlChecked' invece di'! = True' o '== false' –

1

Il parametro per Take requres un int e si passa in un'espressione delegato/lambda. Take è progettato per prendere solo il primo count degli elementi.

È possibile utilizzare il metodo Count e inoltrare un delegato per contare gli elementi che soddisfano i relativi criteri. In questo modo si esegue una sola volta l'IEnumerable iterumerico, anziché prima di quelli che non soddisfano i criteri, e poi di nuovo per contarli effettivamente.

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