Za każdym razem, gdy widzę pytanie opublikowane na przepełnieniu stosu na C #, widzę co najmniej jedną lub dwie odpowiedzi, które rozwiązują problem z LINQ. Zwykle ludzie o bardzo wysokiej reputacji wydają się używać LINQ jak profesjonaliści.
Moje pytanie brzmi: do jakiej domeny problemowej należy użyć LINQ?
Również na marginesie: Czy są jakieś cele, w których należy tego unikać? Czy rozmiar zestawu danych wpływa na wydajność zapytań LINQ?
c#
linq
professional-development
użytkownik1816120
źródło
źródło
Odpowiedzi:
LINQ został zaprojektowany przede wszystkim w celu umożliwienia czysto funkcjonalnych zapytań i transformacji sekwencji danych (zauważysz, że wszystkie rozszerzenia LINQ biorą delegatów Func, ale nie delegatów akcji). W związku z tym najczęstszym przypadkiem pętli, która nie pasuje bardzo dobrze do LINQ, jest przypadek, w którym chodzi o niejasne funkcjonalne skutki uboczne, np.
Aby lepiej korzystać z LINQ, po prostu ćwicz go.
Za każdym razem, gdy masz zamiar napisać komendę
for
lubforeach
pętlę, aby zrobić coś z kolekcją, zatrzymaj się, zastanów się, czy to dobrze pasuje do LINQ (tj. Nie chodzi tylko o wykonanie akcji / efektu ubocznego na elementach), a jeśli tak, zmuś się do napisania używając LINQ.Możesz także
foreach
najpierw napisać wersję, a następnie przepisać ją na wersję LINQ.Jak wskazuje svick, LINQ powinien polegać na zwiększeniu czytelności programu. Zwykle jest w tym dobry, ponieważ podkreśla raczej intencję kodu niż mechanizmu; jednak jeśli okaże się, że nie można uczynić zapytań bardziej czytelnymi niż zwykła pętla, nie krępuj się i trzymaj się pętli.
Jeśli potrzebujesz ćwiczeń do ćwiczenia, większość funkcjonalnych ćwiczeń z programowaniem ładnie odwzoruje na LINQ, np. 99 problemów (szczególnie pierwszych 20 lub więcej) lub euler projektu .
źródło
Aggregate()
. Myślę, że przez większość czasu pętla jest bardziej czytelna.Aby odpowiedzieć na edytowane pytanie: krótko mówiąc, warto skorzystać z LINQ, ilekroć trzeba zaimplementować funkcję „zapytania” (to właśnie oznacza Q w LINQ). Określenie dokładnej domeny jest trudne, ale znacznie upraszcza różnorodne zadania związane z wyodrębnianiem i manipulowaniem danymi z kolekcji.
Aby nieco rozwinąć, wiele funkcji zapytań zostało wprowadzonych bezpośrednio do języka (a raczej różnych implementatorów LINQ), więc rzeczy takie jak agregacje, porządkowanie, grupowanie, filtrowanie, projekcje, łączenia (i wiele innych) są obsługiwane dla ty. Rozwiązania oparte na LINQ są również zwykle znacznie krótsze niż gdybyś wdrożył je „ręcznie”, a także znacznie lepiej zakomunikował swoje zamiary.
Prostym przykładem, który często pomaga przekazać moc LINQ, jest wyświetlenie zawartości katalogu pogrupowanego według rozszerzeń. Przeprowadź typową implementację imperatywną w swojej głowie - na początku będzie wiele szczegółów implementacji. Być może użyjemy a
Dictionary<String, List<String>>
do indeksowania plików według rozszerzenia. Oczywiście będziemy musieli sprawdzić, czy klucz już istnieje, utworzyć instancję listy, dodać do niej itp. Może to wyglądać następująco:Rozważ odpowiednik LINQ:
Zauważ, że samo zapytanie ma tylko 2 wiersze, z pewnością krótsze niż jakiekolwiek bezwzględnie konieczne rozwiązanie. Jest również dość czytelny; stosunek sygnału do szumu jest wyższy niż w pierwszym rozwiązaniu. W przypadku nowych użytkowników LINQ wyniki tego zapytania byłyby wyświetlane w następujący sposób:
W przypadku bardziej złożonych przykładów różnice zwykle stają się jeszcze większe (na przykład po prostu pogrupuj według wielu pól). Podsumowując, LINQ rozwiązuje wiele codziennych problemów z kwerendami danych w sposób, który jest często krótszy i bardziej opisowy. To wymaga niewielkiego kosztu nauki składni i technologii, ale korzyści znacznie przewyższają negatywne.
źródło
Z czasem opracowano różne języki dla różnych typów źródeł danych, na przykład SQL dla relacyjnych baz danych i XQuery dla XML. Dlatego programiści musieli nauczyć się nowego języka zapytań dla każdego typu źródła danych lub formatu danych, który muszą obsługiwać. LINQ upraszcza tę sytuację, oferując spójny model pracy z danymi w różnych źródłach i formatach danych. W zapytaniu LINQ zawsze pracujesz z obiektami. więcej informacji na stronie http://msdn.microsoft.com/en-us/library/bb397906.aspx
źródło