Widziałem wielokrotnie API (szczególnie w .NET framework), który używa Func<TObject, bool>
, gdy Predicate<TObject>
jest pozornie doskonale odpowiedzialną opcją. Jakie powody mogą mieć projektanci interfejsów API?Func <TObject, bool> lub Predicate <TObject>?
Odpowiedz
W LINQ, Func<T, bool>
służy do rzeczy jak Where
tak, że inny przeciążenie który przyjmuje indeksu, jak również jako element jest zgodny:
IEnumerable<T> Where(IEnumerable<T> source, Func<T, bool> predicate)
IEnumerable<T> Where(IEnumerable<T> source, Func<T, int, bool> predicate)
Osobiście myślę, że nazwa Predicate
jest bardziej opisowy, więc I by używać go w sytuacjach, w których nie ma problem konsystencja jak ten powyżej. Pamiętaj, że jest coś do powiedzenia tylko potrzebują wiedzieć o rodzajach delegatów Action
i Func
...
Spójność z resztą LINQ?
(The „anomalia” odnotowano, ale z anonimowych delegatów i funkcji lambda nie ma znaczenia, więc prawie nigdy nie trzeba zdawać sobie sprawę z różnicy).
Tak, ale dlaczego LINQ to zrobić? –
Nie uważam też, że "konsystencja" z resztą LINQ jest powodem dla dobra. –
Zobacz odpowiedź Jona dla jednej możliwości. – Richard
FUNC <> Delegaci są „nowe "sposób określania lambdas/delegatów na metody. Jednak jest tam tylko poręczny zestaw delegatów, a jeśli jest bardziej konkretny delegat, który robi to samo, to idź do tego.
W przykładzie bym zawsze iść do orzecznika <> jak to jest znacznie bardziej samodokumentujące (zakładając, że predykat jest to, co chcesz)
- 1. Func <T>() vs Func <T>. Invoke()
- 2. IList <T> .FindIndex (Int32, Predicate <T>)
- 3. LINQ-do-SQL: Konwertuj Func <T, T, bool> na wyrażenie <Func <T, T, bool>>
- 4. Jak przekonwertować wyrażenie <Func <T, bool>> na predykat <T>
- 5. Refaktoryzacja Func <T> w Wyrażenie <Func<T>>
- 6. Jak przekonwertować Func <T,bool> ekspresji <Func<T,bool>>
- 7. Jak wygenerować wyrażenie <Func<T,bool>> z wyrażenia <Func<T>>
- 8. Jak oddać Expression <Func <T, DateTime>> do Expression <Func <T, object>>
- 9. Konwersja Expression <Func <T1,bool>> do Expression <Func <T2,bool> dynamicznie
- 10. Konwersja orzecznika <T> do Func <T, bool>
- 11. asynchroniczny lambda ekspresji <Func<Task>>
- 12. Lista wyrażeń <Func <T, TProperty >>
- 13. C# Action <> z <> parametr Func
- 14. Utwórz wyrażenie <Func<,>> używając odbicia
- 15. Konwersja Func <T, String> do Func <T, bool>
- 16. Expression <Func <T, bool>> z F # func
- 17. C# Func <> delegaci w bibliotece
- 18. Jak działa Func <T,TResult>?
- 19. Przekazywanie warunku do Func <bool> ciągu znaków zapytania Tuple <string, string, Func <bool>>
- 20. cout << "привет"; lub wcout << L "привет";
- 21. Przesyłanie uczestnika do działania <T> lub Func <T> w środowisku wykonawczym
- 22. Czy mogę mieć Action <> lub Func <> z out-out?
- 23. Lambda Func <> i Fluent
- 24. Autofac delegate factory using func <>
- 25. C# Func <> i generics
- 26. wykonawcza tworzenie rodzajowe Func <T>
- 27. Dynamicznie ustawiać Func <> typy
- 28. Wyrażenie <Func <TEntity, bool >> zagnieżdżanie, które działa z Entity Framework
- 29. Tworzenie Func <IQueryable <TEntity>, IOrderedQueryable <TEntity>> dynamicznie?
- 30. Oparte na Linq generyczne alternatywne do Predicate <T>?
Tak, obawiam się, że odpowiedź nie będzie lepsza od tej. To jest jak jakaś biurokracja kodowana przez aspekt czystości. (tzn. predykat powinien być zawsze używany pomimo spójności). –