«

»

sie 14

Linq inside (yield)

W poprzednim wpisie opisałem extension methods, dzisiaj czas na kolejny element moim zdaniem bardzo ważny do zrozumienia działania linq mianowicie słowo kluczowe yield.
Dla przypomnienia Linq jest połączeniem 5 elementów:

Zasadę działania słowa kluczowego yield najlepiej zobrazuje przykład. Załóżmy, że mamy metodę, która generuje kolekcję danych, w naszym przypadku intów, wygenerowanie każdego elementu trwa 1 ms.

Teraz załóżmy, ze chcemy znaleźć liczby pierwsze (patrz poprzedni post), ale tylko wśród pierwszych 50 elementów kolekcji.

Jak długo będzie wykonywała się ta metoda? Ok 100 ms ponieważ tyle trwa generowanie danych. Tylko nie potrzebnie generujemy połowę danych. Jak to przyśpieszyć? Tutaj właśnie przychodzi nam z pomocą yield a w tym konkretnym przypadku yield return

Zmodyfikowana metoda:

Yield return powoduje wstrzymanie iteracji przekazując odpowiednią wartość do enumeratora (obiektu, który obsługuje iteracje po kolekcji) i zwraca sterowanie do metody która ją wywołuje w tym przypadku Main. Jak teraz zachowuje się nasz program? Program wykonuje się w ok 50Ms oraz wyniki pojawiają się na ekranie od razu, wcześniej trzeba było poczekać aż wygenerowane zostaną dane a później następowało sprawdzenie czy liczba jest liczbą pierwszą.

Utworzyliśmy właśnie tzw. leniwą kolekcję tzn. taką, która zwraca kolejny element, wtedy kiedy jest on potrzebny. Mechanizm ten jest namiętnie wykorzystywany w linq czego przykłady pojawią się w kolejnych wpisach.

3 Komentarze

  1. Wedlock

    a nie dało by się częściej pisać ? zamierzałem do LINQ się dosiąść a skoro tu mam okazję to z chęcią zassał bym nową wiedzę :)

    1. graf

      Planowalem dodawac dwa wpisy tygodniowo, ale jesli bedzie wieksze zainteresowanie to pewnie zwieksze czestotliwosc;)

  2. Mateusz

    Ja również przyłączyłbym się do większej częstotliwości wpisów, tym bardziej dla JUNIOR DEV :)

Odpowiedz na „WedlockAnuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć tych znaczników i atrybutów HTMLa: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Current day month ye@r *