GoDev

Blog programisty.

Programowanie Reaktywne - Kombinatorzy - Start With.


Artykuł ten jest częścią serii artykułów na temat Programowania reaktywnego.

Zapraszam na GitHub-a.

Tematy

  1. Wstęp
  2. Zabawa z czasem - Timer
  3. Kto za tym stoi? - Scheduler
  4. Nie zapominaj - Subscribe
  5. Zabawa z czasem - Interval
  6. Zabawa z czasem - Buffer
  7. Zabawa z czasem - Delay
  8. Zabawa z czasem - Sample
  9. Zabawa z czasem - Throttle
  10. Zabawa z czasem - Timestamp/TimeInterval
  11. Tworzymy dane - Generators
  12. Tworzymy dane - Własna klasa publikująca
  13. Marudzimy - Skip
  14. Marudzimy - Take
  15. Łap To! - ConsoleKey
  16. Kombinatorzy - Concat
  17. Kombinatorzy - Repeat
  18. Kombinatorzy - Start With
  19. Kombinatorzy - Ambiguous
  20. Kombinatorzy - Merge
  21. Kombinatorzy - Zip
  22. Kombinatorzy - Switch
  23. Kombinatorzy - When-And-Then
  24. Kombinatorzy - Combine Latest
  25. Transformers - Select
  26. Transformers - OfType and Cast
  27. Transformers - Metadata
  28. Bileciki do kontroli - Unit Tests of Interval
  29. Bileciki do kontroli - Unit Tests of Observer Interval
  30. Bileciki do kontroli - Unit Tests of Create Cold/Hot Observable
  31. Szpryca - AutoFac

Wstęp

Reactive Extensions - Start With Dzisiaj kolejny operatorek pozwalający na kombinowanie ze strumieniami. Tym razem taki co to potrafi się wepchnąć do kolejki i być na początku. Jak to i w życiu bywa co nie jest odpowiednim zachowanie. Jednak w przypadku programowania z wykorzystaniem Rx-ów jak najbardziej.

StartWith

Dzisiejszy bohater pozwala na wrzucenie danych na sam początek strumienia. Można w ten sposób kontrolować konkretnie co znajduje się na początku.

Poniższa metoda GetTimeListSamples tworzy listę obiektów typy Time. Po utworzeniu listy zwracamy ją i będziemy wpychać na sam początek kolejeczki.

1
2
3
4
5
6
7
8
private static List<Time> GetTimeListSamples()
{
  var timeList = new List<Time>();

  for (short i = 10; i < 20; i++)
  {
    timeList.Add(new Time {Hours = i, Minutes = i, Seconds = i});
  }

Reactive Extensions - Start With

Wynikiem powyższej metody jest timeList, która zostanie wstrzyknięta między Subscribe, a dystrybutorem timer-owatym TimeCounter. Służy do tego StartWith przyjmująca w tym przypadku uprzednio wygenerowaną listę. Ważne by była to list rozszerzająca interfejs IEnumberable.

1
2
3
4
5
6
7
8
9
10
11
12
var timeList = GetTimeListSamples();

  var subscribent = observableProvider
    .TimeCounter
    .StartWith(timeList)
    .
    .
    .
    .Subscribe(
    time =>
    {
      Console.WriteLine(time);

Inna tważ StartWith przyjmuje parametry jako params. Czyli tyle ile chcemy, tyle wrzucamy.

1
2
3
4
5
6
7
8
9
10
.StartWith(
    new Time { Hours = 1, Minutes = 10 },
    new Time { Hours = 2, Minutes = 20 },
    new Time { Hours = 3, Minutes = 10, Seconds = 20 },
    new Time { Hours = 4, Minutes = 10 }
  )
  .Subscribe(
    time =>
    {
      Console.WriteLine(time);

Oczywiście w tym przypadku wszystkie wepchane obiekty Time zostaną wypchnięte na strumie od razu. I dopiero po tej operacji zostanie uruchomiony normalny cykl zaimplementowany w klasie TimeCounter.

Zakończenie

StartWith może się okazać bardzo przydatnym operatorem, jeżeli będziemy chcieli mieć pewien rodzaj kontroli nad tym co ma znaleźć się na początku strumienia. W przeciwnym przypadku nie wiedzę zbyt przydatnego zastosowania. Jednak warto wiedzieć, że można taką manipulację wykonać. Jak zawsze zapraszam na GitHub**. Do zaczytaczyska :).


Jest to post wchodzący w skład podjętego wyzwania ogłoszonego przez MIROBURN we vlogu z dnia 3 lutego 2018 roku.

Celem wyzwania jest systematyczne działanie w ciągu 30 dni.

Postanowiłem pisać post dziennie o tematyce Programowania Reaktywnego dla platformy .NET.

Wszelkie źródła związane z postami znajdują się na repozytorium GitHub.

Stan obecny wyzwania: 30 z 30 dni.


Referencje:


Wcześniejszy: Programowanie Reaktywne - Kombinatorzy - Repeat

Następny: Programowanie Reaktywne - Kombinatorzy - Ambiguous