Laissez-moi expliquer ce que je veux atteindre en premier.mise en mémoire tampon basée sur les données dans Rx
Disons que je la forme d'entrée de données suivant le flux d'événements
var data = new string[] {
"hello",
"Using",
"ok:michael",
"ok",
"begin:events",
"1:232",
"2:343",
"end:events",
"error:dfljsdf",
"fdl",
"error:fjkdjslf",
"ok"
};
Quand je souscris à la source de données, je voudrais obtenir le résultat suivant
"ok:michael"
"ok"
"begin:events 1:232 2:343 end:events"
"error:dfljsdf"
"error:fjkdjslf"
"ok"
Fondamentalement, je veux obtenir toutes les données que commencent par ok ou erreur et les données entre début et fin.
J'ai essayé jusqu'à présent ..
var data = new string[] {
"hello",
"Using",
"ok:michael",
"ok",
"begin:events",
"1:232",
"2:343",
"end:events",
"error:dfljsdf",
"fdl",
"error:fjkdjslf",
"ok"
};
var dataStream = Observable.Generate(
data.GetEnumerator(),
e => e.MoveNext(),
e => e,
e => e.Current.ToString(),
e => TimeSpan.FromSeconds(0.1));
var onelineStream = from d in dataStream
where d.StartsWith("ok") || d.StartsWith("error")
select d;
// ???
// may be need to buffer? I want to get data like "begin:events 1:232 2:343 end:events"
// but it is not working...
var multiLineStream = from list in dataStream.Buffer<string, string, string>(
bufferOpenings: dataStream.Where(d => d.StartsWith("begin")),
bufferClosingSelector: b => dataStream.Where(d => d.StartsWith("end")))
select String.Join(" ", list);
// merge two stream????
// but I have no clue how to merge these twos :(
mergeStream .Subscribe(d =>
{
Console.WriteLine(d);
Console.WriteLine();
});
Depuis que je suis très nouveau à la programmation réactive, je ne peux pas me faire penser de manière réactive. :(
Merci à l'avance.
Je souhaiterais pouvoir faire la promotion 10 fois. :) –
pour les informations pour les autres visiteurs, si 'dataStream' est créé à partir d'événements (dans mon cas, méthode d'usine' Observable.FromEvent'), la méthode 'Publish' n'est pas nécessaire. –
C'est vraiment une excellente réponse qui couvre complètement toutes les questions dans le code original dans un style très éducatif. Crédit complet. – yamen