Consideraría esto como un lugar apropiado para usar la separación de comando / consulta . Por ejemplo:
// query
var validItems = items.Where(i => i.Field != null && i.State != ItemStates.Deleted);
// command
foreach (var item in validItems) {
// do stuff
}
Esto también le permite dar un buen nombre autodocumentado al resultado de la consulta. También le ayuda a ver oportunidades para refactorizar, porque es mucho más fácil refactorizar el código que solo consulta datos o solo muta datos que el código mixto que intenta hacer ambas cosas.
Al depurar, puede romper antes foreach
para verificar rápidamente si el contenido de la validItems
resolución se ajusta a lo que espera. No tiene que pisar el lambda a menos que lo necesite. Si necesita ingresar a la lambda, le sugiero que la descomponga en una función separada, luego en lugar de eso.
¿Hay alguna diferencia en el rendimiento? Si la consulta está respaldada por una base de datos, entonces la versión LINQ tiene el potencial de ejecutarse más rápido, porque la consulta SQL puede ser más eficiente. Si es LINQ to Objects, entonces no verá ninguna diferencia de rendimiento real. Como siempre, perfile su código y corrija los cuellos de botella que realmente se informan, en lugar de tratar de predecir optimizaciones por adelantado.