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
List<T>
ha un metodo ForEach()
progettato per questo.
È possibile implementare un metodo di estensione ForEach su IEnumerable.
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.
Fino ad ora non sapevo più MoreLINQ. Viene ora referenziato e viene utilizzato ForEach al posto del mio homegrown Ognuno. Grazie! –
Grande spiegazione sul motivo per cui non è implementato su IEnumerable
- 1. Stampa ed eseguire una stringa
- 2. Come eseguire correttamente il makefile per compilare ed eseguire?
- 3. autoestraente che estrae ed eseguire un file
- 4. è una buona pratica usare mysql_free_result ($ result)?
- 5. Cattiva pratica per eseguire il codice nel costruttore che potrebbe fallire?
- 6. Utilizzare VBScript per aprire un'applicazione ed eseguire le azioni in essa
- 7. Come eseguire il robot basato su Erlang? È possibile convertirlo in .hex ed eseguire il microcontrollore?
- 8. È una cattiva pratica usare campi nascosti?
- 9. IDE per scrivere ed eseguire lavori hadoop?
- 10. Come compilare ed eseguire il codice dinamicamente?
- 11. È considerata una cattiva pratica eseguire il POST HTTP senza corpo entità?
- 12. come installare ed eseguire phpize
- 13. Posso usare ECHO per eseguire i comandi?
- 14. Linq Selezionare Raggruppa per
- 15. Linq Impossibile eseguire il cast Problema
- 16. Webpack 2 - è una cattiva pratica usare il pacchetto "fornitori"?
- 17. Come eseguire azioni per build fallite in Jenkinsfile
- 18. Script Python - connettersi a SSH ed eseguire il comando
- 19. Forzare linq per eseguire join interni
- 20. COME USARE Pycharm per eseguire il debug di script Python?
- 21. È buona pratica usare assert in Java?
- 22. Come eseguire azioni collettive con Active Admin
- 23. Come eseguire il debug delle azioni del selenio WebDriver?
- 24. Come posso usare numpy.correlate per eseguire l'autocorrelazione?
- 25. Eseguire le azioni after_success in modo condizionale?
- 26. Considerare una pratica scorretta riavviare apache (con grazia) ogni 1/5/10 minuti?
- 27. È una cattiva pratica usare le funzioni in OOP?
- 28. Devo usare sp_executesql o EXEC per eseguire una stored procedure?
- 29. non può usare .bind() per eseguire il bover hover
- 30. Usare android gradle + dagger per eseguire instrumentTests
Ho aggiunto il mio metodo di estensione denominato Each() a IEnumerable che fa lo stesso. –