He visto una y otra vez API (especialmente en el marco de .NET) que usa Func<TObject, bool>
cuando Predicate<TObject>
es aparentemente una opción perfectamente responsable. ¿Qué buenas razones podría tener un diseñador de API para hacerlo?Func <TObject, bool> o Predicate <TObject>?
Respuesta
En LINQ, Func<T, bool>
se utiliza para cosas como Where
para que el otra sobrecarga que toma el índice, así como el elemento es consistente:
IEnumerable<T> Where(IEnumerable<T> source, Func<T, bool> predicate)
IEnumerable<T> Where(IEnumerable<T> source, Func<T, int, bool> predicate)
personalmente creo que el nombre Predicate
es más descriptivo, por lo I lo uso en situaciones en las que no hay problema de consistencia similar a la anterior. Eso sí, hay algo que decir solo para saber sobre los tipos de delegados Action
y Func
...
¿Coherencia con el resto de LINQ?
(La "anomalía" se ha señalado, pero con delegados anónimos y funciones lambda no hay diferencia, por lo que casi nunca tienen que ser conscientes de la diferencia).
Sí, pero ¿POR QUÉ LINQ lo hizo? –
Tampoco creo que la "consistencia" con el resto de LINQ sea buena razón. –
Vea la respuesta de Jon para una posibilidad. – Richard
Los Func <> delegados son la "nueva "forma de especificar lambdas/delegados a los métodos. Sin embargo, solo hay un práctico grupo de delegados, y si hay un delegado más específico que haga lo mismo, entonces vaya por eso.
En su ejemplo siempre me iría a por el predicado <> ya que es mucho más auto-documentado (suponiendo un predicado es lo que quiere)
- 1. Refactorando Func <T> en la Expresión <Func<T>>
- 2. ¿Por qué es Func <T> ambiguo con Func <IEnumerable <T>>?
- 3. Func <> tipos dinámicamente
- 4. ¿Cómo redacto Linq Expressions? es decir Func <Exp <Func<X, Y>>, Exp <Func<Y, Z>>, Exp <Func<X, Z> >>
- 5. C# Cómo convertir una expresión <Func <SomeType>> en una expresión <Func <OtherType>>
- 6. ¿Cómo creo dinámicamente un predicado Expression <Func <MyClass, bool >> de Expression <Func <MyClass, string >>?
- 7. LINQ-to-SQL: Convertir Func <T, T, bool> en una expresión <Func <T, T, bool>>
- 8. usa Func <> (o Acción <>) o crea un delegado propio?
- 9. ¿Por qué Func <T,bool> en lugar de Predicado <T>?
- 10. Reverse of Expression <Func <T,TResult>> .Compile()?
- 11. ¿Cómo se convierte implícitamente un Func <T> a la Expresión <Func<T>>?
- 12. caché compilar desde Expresión <Func<T>>
- 13. C# Acción <> con Func <> parámetro
- 14. ¿Qué usar? delegar, evento o Func <T>?
- 15. Cómo convertir una expresión <Func <T, bool>> a un Predicado <T>
- 16. Expresión <Func <T, bool>> desde un F # func
- 17. Convertir Func <T, String> a Func <T, bool>
- 18. ¿Func <T> .BeginInvoke usa ThreadPool?
- 19. Cómo crear una expresión <Func <dynamic, dynamic >> - ¿O es un error?
- 20. ¿Puedo tener una Acción <> o Func <> con un parámetro out?
- 21. ¿Cómo funciona Func <T,TResult>?
- 22. Moq framework Func <T,T>
- 23. Func <T> sin el parámetro
- 24. Moq Cuando (<bool> Func) Método
- 25. C# Func <> y genéricos
- 26. Lambda Func <> y Fluent
- 27. cómo lanzar la expresión <Func <T, DateTime>> para la expresión <Func <T, object>>
- 28. Moq.Mock <Expression <Func<T,bool> >>() - cómo configurar expresiones en un Mock usando Moq
- 29. Acción <T> o Acción <in T>?
- 30. Expresión <Func <TModel, string >> a Expression <Acción <TModel>> "Getter" a "Setter"
Sí, me temo que la respuesta no va a ser mejor que esto. Es como una especie de burocracia codificada que se ganó un aspecto de pureza. (es decir, el predicado siempre debe usarse a pesar de la consistencia). –