Artykuł ten jest częścią serii artykułów na temat Programowania reaktywnego.
Zapraszam na GitHub-a.
Tematy
- Wstęp
- Zabawa z czasem - Timer
- Kto za tym stoi? - Scheduler
- Nie zapominaj - Subscribe
- Zabawa z czasem - Interval
- Zabawa z czasem - Buffer
- Zabawa z czasem - Delay
- Zabawa z czasem - Sample
- Zabawa z czasem - Throttle
- Zabawa z czasem - Timestamp/TimeInterval
- Tworzymy dane - Generators
- Tworzymy dane - Własna klasa publikująca
- Marudzimy - Skip
- Marudzimy - Take
- Łap To! - ConsoleKey
- Kombinatorzy - Concat
- Kombinatorzy - Repeat
- Kombinatorzy - Start With
- Kombinatorzy - Ambiguous
- Kombinatorzy - Merge
- Kombinatorzy - Zip
- Kombinatorzy - Switch
- Kombinatorzy - When-And-Then
- Kombinatorzy - Combine Latest
- Transformers - Select
- Transformers - OfType and Cast
- Transformers - Metadata
- Bileciki do kontroli - Unit Tests of Interval
- Bileciki do kontroli - Unit Tests of Observer Interval
- Bileciki do kontroli - Unit Tests of Create Cold/Hot Observable
- Szpryca - AutoFac
Wstęp
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});
}
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:
- MSDN - Getting Started with Rx,
- MSDN - Reactive Extensions,
- 101 Rx Samples,
- ReactiveX,
- Code Project,
- GitHub
Wcześniejszy: Programowanie Reaktywne - Kombinatorzy - Repeat
Następny: Programowanie Reaktywne - Kombinatorzy - Ambiguous