Ho visto più volte API (in particolare nel framework .NET) che utilizza Func<TObject, bool>
quando Predicate<TObject>
è un'opzione apparentemente perfettamente responsabile. Quali motivi validi per potrebbero avere un progettista API per farlo?Func <TObject, bool> o Predicate <TObject>?
risposta
In LINQ, Func<T, bool>
è usato per cose come Where
in modo che il altro sovraccarico che prende l'indice così come l'elemento è coerente:
IEnumerable<T> Where(IEnumerable<T> source, Func<T, bool> predicate)
IEnumerable<T> Where(IEnumerable<T> source, Func<T, int, bool> predicate)
personalmente credo che il nome Predicate
è più descrittivo, in modo da mi lo uso in situazioni in cui non c'è nessun problema di consistenza come quella qui sopra. Intendiamoci, c'è qualcosa da dire solo per conoscere i tipi di delegati Action
e Func
...
Coerenza con il resto di LINQ?
(L ' "anomalia" è stato notato, ma con i delegati anonimi e funzioni lambda non fa alcuna differenza, in modo quasi mai bisogno di essere a conoscenza della differenza.)
Sì, ma PERCHE 'LINQ lo ha fatto? –
Inoltre, non penso che la "coerenza" con il resto di LINQ sia una ragione valida per . –
Vedi la risposta di Jon per una possibilità. – Richard
Le Funz <> delegati sono il "nuovo "modo di specificare lambda/delegati ai metodi. Tuttavia, c'è solo un pratico insieme di delegati, e se c'è un delegato più specifico che fa la stessa cosa, allora faccia quello.
Nel tuo esempio ho sempre andare per il predicato <> in quanto è molto più auto-documentazione (assumendo un predicato è quello che volete)
- 1. Func <T>() vs Func <T> .Invoke()
- 2. LINQ-to-SQL: Converti Func <T, T, bool> in un'espressione <Func <T, T, bool>>
- 3. TProc <TObject> a TNotifyEvent
- 4. Come convertire un'espressione <Func <T, bool>> in un predicato <T>
- 5. Come convertire Func <T,bool> a Expression <Func<T,bool>>
- 6. Task.Run e Func <>
- 7. Convertire Expression <Func <T1,bool>> per Expression <Func <T2,bool> dinamicamente
- 8. C# Come convertire un'espressione <Func <SomeType>> in un'espressione <Func <OtherType>>
- 9. Perché Func <T,bool> invece di Predicato <T>?
- 10. Reverse of Expression <Func <T,TResult>> .Compile()?
- 11. Async lambda a Expression <Func<Task>>
- 12. Elenco di espressioni <Func <T, TProperty >>
- 13. Creare un'espressione <Func<,>> utilizzando la riflessione
- 14. Expression <Func <T, bool>> da un F # func
- 15. Convertire Func <T, String> in Func <T, bool>
- 16. Tipi dinamicamente Func <> tipi
- 17. Come posso eseguire un oggetto Func <oggetto [], espressione <Func<T,bool> >> dinamico?
- 18. Perché Func <> ed Expression <Func<>> Intercambiabile? Perché uno lavora nel mio caso?
- 19. Passaggio di una condizione in Func <bool> di una tupla <stringa, stringa, Func <bool>>
- 20. Da BinaryExpression a Expression <Func <T, bool>>
- 21. Posso avere un'azione <> o Func <> con un parametro out?
- 22. Trasferimento di un delegato in un'azione <T> o Func <T> in runtime
- 23. Come funziona Func <T,TResult>?
- 24. C# Func <> e generics
- 25. Azione uguale a Func <TResult>?
- 26. Func Nullable <T, TResult>
- 27. Func <T> con parametro out
- 28. Creazione di Func <IQueryable <TEntity>, IOrderedQueryable <TEntity>> dinamicamente?
- 29. cout << "привет"; o wcout << L "привет";
- 30. dinamica Func <IQueryable <TEntity>, IOrderedQueryable <TEntity>> Espressione
Sì, temo che la risposta non migliorerà. È come se una sorta di codice burocratico conquistasse un aspetto di purezza. (Ad esempio, il predicato dovrebbe sempre essere usato nonostante la coerenza). –