2010-03-24 16 views
9

Quando si scrive una catena metodo per LINQ, posso fare le dichiarazioni Dove uno dei due modi:Clausole Linq Where - È meglio impilare o combinare?

var blackOldCats = cats.Where(cat => cat.Age > 7 && cat.Colour == "noir") 

O

var blackOldCats = cats.Where(cat => cat.Age > 7).Where(cat => cat.Colour == "noir") 

Esistono vantaggi di uno sopra l'altro?

Non preoccuparti troppo dei tipi di dati in questo esempio, ma se ci sono problemi con i tipi di dati, sarebbe utile saperlo.

L'ovvio è che l'oggetto è già referenziato, quindi due proprietà colpite contemporaneamente sono più facili sull'applicazione, giusto?

+0

Quando chiedi informazioni sui vantaggi si riferisce a prestazioni, leggibilità o altro? – Kane

+0

Qualsiasi vantaggio eccetto la leggibilità, poiché entrambi sono abbastanza leggibili nel mio POV – Dann

risposta

3

Nel tuo esempio sono uguali e sono una questione di preferenze personali. A causa dell'esecuzione posticipata di LINQ, la raccolta verrà iterata una sola volta.

Se si desidera combinare le espressioni utilizzando un operatore o, è possibile utilizzare solo il primo.

+0

Non mi ero accorto che il LINQ funzionava in quel modo (anche se adesso ha senso). Stavo pensando che il primo sarebbe stato il più veloce a causa del confronto combinato. Felice ho messo questa Q adesso. – Dann

0

Il primo sarebbe leggermente più veloce in quanto riduce un po 'l'overhead. Oltre a questo vengono elaborati sostanzialmente allo stesso modo.

Una differenza evidente, tuttavia, è che la proprietà Color viene confrontata prima della proprietà Age nel secondo esempio. Se si vuole un confronto più economico per corto circuito una più costosa (in modo che la proprietà Color viene confrontato solo per gli elementi in cui il confronto Age è vero), si dovrebbe mettere il più economico nell'ultimo Where chiamata:

var blackOldCats = 
    cats 
    .Where(cat => cat.Colour == "noir") 
    .Where(cat => cat.Age > 7); 

In questo caso non c'è molta differenza nel costo dei confronti, ma se uno è molto più costoso dell'altro, è bene sapere in che ordine vengono valutati.

+2

Puoi spiegare perché mettere il confronto più economico alla fine, invece che al fronte? Lo farei al contrario, ma solo per istinto, non per buoni motivi. =) – Jens

+1

Ho scritto una piccola applicazione di test, che conferma il mio istinto qui (due frasi in cui una prende un breve Thread.Sleep, l'altra è veloce). Ogni dove la chiamata sembra essere eseguita sul risultato della precedente, quindi i confronti più economici dovrebbero essere i primi. Ho fatto un errore? – Jens

+0

Jens ha ragione, la tua affermazione è a ritroso. L'ho appena testato con un metodo che ha il diritto di console quando viene colpito e i metodi sono eseguiti in sequenza, da sinistra a destra – Dann

Problemi correlati