Ich habe immer und immer wieder API (vor allem im .NET-Framework) gesehen, die Func<TObject, bool>
verwendet, wenn Predicate<TObject>
scheinbar eine vollkommen verantwortliche Option ist. Was gut Gründe könnte ein API-Designer dafür haben?Func <TObject, bool> oder Prädikat <TObject>?
Antwort
In LINQ, Func<T, bool>
für Dinge wie Where
verwendet wird, so dass die andere über~~POS=TRUNC, die den Index als auch das Element nimmt, ist konsequent:
IEnumerable<T> Where(IEnumerable<T> source, Func<T, bool> predicate)
IEnumerable<T> Where(IEnumerable<T> source, Func<T, int, bool> predicate)
ich persönlich denke, der Name Predicate
mehr beschreibend ist, so ich würde es in Situationen verwenden, in denen es wie die oben keine Konsistenz Problem ist. Wohlgemerkt, es gibt etwas zu sagen, nur über die Action
und Func
Delegattypen wissen müssen ...
Konsistenz mit dem Rest von LINQ?
(Der „Anomalie“ hat zur Kenntnis genommen, aber mit anonym Delegierten und Lambda-Funktionen macht es keinen Unterschied, so gut wie nie bewusst den Unterschiedes sein muß.)
Ja, aber WARUM hat LINQ es tun? –
Ich denke auch nicht, dass "Konsistenz" mit dem Rest von LINQ ist ein gut Grund. –
Siehe Jon's Antwort für eine Möglichkeit. – Richard
Die Func <> Delegierten die „neu "Möglichkeit, Lambdas/Delegierte für Methoden anzugeben. Allerdings gibt es nur eine handliche Gruppe von Delegaten, und wenn es einen spezifischeren Delegaten gibt, der dasselbe tut, dann gehen Sie dafür.
In Ihrem Beispiel hat ich immer für das Prädikat gehen würde <> wie es ist viel mehr selbsterklärend (ein Prädikats unter der Annahme ist, was Sie wollen)
- 1. TPROC <TObject> TNotifyEvent
- 2. Func <T>() vs Func <T>. Invoke()
- 3. Wie konvertiert man Func <T, bool> in Prädikat <T>?
- 4. Wie erstelle ich dynamisch einen Ausdruck <Func <MyClass, bool >> Prädikat?
- 5. Expression <Func <T, bool>> Prädikat zwei Typen
- 6. So verwenden Sie dieses eine öffentliche IEnumerable <T> Suchen (Ausdruck <Func <T, bool>> Prädikat)?
- 7. Wie konvertiert man einen Ausdruck <Func <T, bool>> in ein Prädikat <T>
- 8. Wie Func konvertieren <T,bool> zu Expression <Func<T,bool>>
- 9. Wie erstellt man Ausdruck <Func <TSource, bool> durch Vergleichen von Func <TSource, int> mit int
- 10. Umwandlung von Ausdruck <Func <TypeIn, TypeOut1 >> in Ausdruck <Func <TypeIn, TypeOut2 >>
- 11. C# - delegieren Prädikat <T>
- 12. Wie komponiere ich Linq Expressions? dh Func <Exp <Func<X, Y>>, Exp <Func<Y, Z>>, Exp <Func<X, Z> >>
- 13. Konvertieren Expression <Func <T1,bool>> zu Expression <Func <T2,bool> dynamisch
- 14. Wie Expression <Func <T, DateTime>>, um Expression werfen <Func <T, object>>
- 15. Wie man Ausdruck <Func<T,bool>> von Ausdruck <Func<T>>
- 16. IList <T> .FindIndex (Int32, Prädikat <T>)
- 17. Verwenden Sie Func <> (oder Aktion <>) oder erstellen Sie einen eigenen Delegaten?
- 18. Auseinanderziehen Ausdruck <Func <T, object>>
- 19. Async Lambda Expression <Func<Task>>
- 20. Dictionary <X, Func<Y>> Zugriff auf das enthaltende Wörterbuch von einem Func <> innerhalb davon
- 21. LINQ Expression <Func <T, bool>> equavalent von .Contains()
- 22. Ist nicht Func <T, bool> und Prädikat <T> das Gleiche nach der Kompilierung?
- 23. IEnumerable <T>. Enthält mit Prädikat
- 24. Konvertieren Func <T, string> [] in Func <T, string[]>?
- 25. Schnellere Möglichkeit, einen Func <T, T2> an Func <T, object> zu senden?
- 26. Warum kompiliert 'Func <IBase>' während 'Func <TGeneric> wo TGeneric: IBase' nicht?
- 27. C# Konvertieren Func <T1, object> zu Func <T1, T2>
- 28. web - button.onclick = func(); vs <Schaltfläche onclick = "func()"?
- 29. Wie kann ich ein Func <object [], Expression <Func<T,bool> >> dynamic?
- 30. Warum sind Func <> und Expression <Func<>> austauschbar? Warum arbeitet man in meinem Fall?
Ja, ich fürchte, die Antwort wird nicht besser werden. Es ist wie eine Art Code-Bürokratie, die einen Aspekt der Reinheit gewonnen hat. (Prädikat sollte trotz Konsistenz immer verwendet werden). –