2009-02-20 3 views
5

Big Subjective Question: Spesso mi trovo a usare LINQ per filtrare un set di oggetti e quindi, dopo la query, eseguire una foreach di vecchio stile per eseguire un'azione su ciascuno dei risultati. Esiste un buon modo per combinare queste due attività in modo tale che venga eseguita un'azione su ciascun oggetto che corrisponde al predicato Where()? Quasi come passare un'azione in Select(). Probabilmente non verrebbe compilato, ma per quanto riguarda il passaggio in un Func che restituisce un bool, allora potremmo annidarlo all'interno di un'altra query che potrebbe fare qualcosa con i fallimenti o i successi. Qualcuno ha fatto questo nel codice di produzione? Questo sarebbe considerato una cattiva pratica? Qualche altro pensiero?È una pratica scorretta usare LINQ per eseguire il loopover ed eseguire azioni piuttosto che selezionare dati?

risposta

8

List<T> ha un metodo ForEach() progettato per questo.

+0

Ho aggiunto il mio metodo di estensione denominato Each() a IEnumerable che fa lo stesso. –

2

È possibile implementare un metodo di estensione ForEach su IEnumerable.

11

Molte persone hanno chiesto un metodo di ForEach - e in effetti lo è a portata di mano (che è il motivo per cui abbiamo una in MoreLINQ). È anche potenzialmente pericoloso.

La maggior parte dei LINQ scoraggia fermamente gli effetti collaterali. Sono possibili, ma scoraggiati. Ecco perché OrderBy ecc restituisce nuove raccolte piuttosto che ordinare quelle esistenti.

Considerare ora ForEach - è una "azione" piuttosto che una funzione, in quanto non restituisce nulla. Se non ha effetti collaterali, è assolutamente inutile! Quindi, va contro una parte della filosofia di LINQ - fondamentalmente non si avvicina alle cose in uno stile funzionale.

Non sto cercando di fare un caso a favore o contro, in realtà - in pratica, credo che una cosa utile per avere, e non mi sorprende che sia in così molte biblioteche, ecc Si tratta di una molto evidente pseudo-operatore da aggiungere. Pensa solo a quello che stai facendo e nota il fatto che stai introducendo effetti collaterali. È una sorta di confine tra lo stile funzionale di LINQ e uno stile di codifica più imperativo.

+0

Fino ad ora non sapevo più MoreLINQ. Viene ora referenziato e viene utilizzato ForEach al posto del mio homegrown Ognuno. Grazie! –

+0

Grande spiegazione sul motivo per cui non è implementato su IEnumerable . Grazie! – Thomas

Problemi correlati