Zip a Grouped IObservable - PullRequest
       13

Zip a Grouped IObservable

0 голосов
/ 02 июня 2019
public delegate void QuoteChangeEvent(IQuote q);

var priceChangedObservable = Observable.FromEvent<QuoteChangeEvent, IQuote> 
    (handler =>
    {
        QuoteChangeEvent qHandler = (e) =>
        {
            handler(e);
        };

        return qHandler;
    },
    qHandler => api.MAPI.OnQuoteChange += qHandler,
    qHandler => api.MAPI.OnQuoteChange -= qHandler);

    var grouped = priceChangedObservable
    .GroupBy(instrument => instrument.Symbol);

То есть grouped из type IObservable<IGroupedObservable<string, IQuote>>

Два вопроса.

1) Я пытался

grouped.SortBy(instrument => instrument.Symbol);

Но SortBy, кажется, не существует?

2) Скажем, есть два символа, которые входят, GOOG и AAPLв grouped.Как мне использовать оператор Zip, чтобы я не мог получить правильный синтаксис, когда у меня Subscribe есть Tuple<IQuote, IQuote>?

.Что-то вроде:

Observable.Zip(?, ?, (a, b) => Tuple.Create(a, b))
    .Subscribe(tup => Console.WriteLine("Quotes: {0} {1}", tup.item1, tup.item2));

РЕДАКТИРОВАТЬ 1

Я почти получил это:

    var first = grouped.Where(group => group.Key == "GOOG").FirstAsync();
    var second = grouped.Where(group => group.Key == "AAPL").FirstAsync();

    Observable.Zip(first, second, (a, b) => Tuple.Create(a, b))
    .Subscribe(tup => Console.WriteLine("Quotes: {0} {1}", tup.Item1, tup.Item2));

Проблема в том, что tup нетип <IQuote, IQuote>, но типа:

Tuple<IGroupedObservable<string, IQuote>, IGroupedObservable<string, IQuote>>

1 Ответ

0 голосов
/ 02 июня 2019

Как это выглядит для вас?

IObservable<(IQuote, IQuote)> results =
    grouped
        .Publish(gs =>
            gs
                .Where(g => g.Key == "GOOG")
                .SelectMany(g => g)
                .Zip(
                    gs
                        .Where(g => g.Key == "AAPL")
                        .SelectMany(g => g),
                    (x, y) => (x, y)));
...