Beispielcode:C# Reactive Extensions - Speicherverwaltung und die Distinct Operator
public static IObservable<Order> ObserveOrders(this IProxy proxy,IEqualityComparer<Order> distinctPerDayComparer)
{
return Observable.FromEvent<Order>(ev => proxy.OrderUpdated += ev,ev => proxy.OrderUpdated -= ev)
.Distinct(distinctPerDayComparer);
}
public class DistinctPerDayComparer : IEqualityComparer<Order>
{
public bool Equals(Order o1, Order o2)
{
if(o1.Id != o2.Id)
return false;
bool isSameDay = o1.Date.Day == o2.Date.Day;
return isSameDay;
}
public int GetHashCode(Order o)
{
return o.Id.GetHashCode();
}
}
public class Order
{
public int Id { get; set; }
public DateTime Date { get; set; }
}
Szenario:
Sequenz:
{id:1,D:'5/25/2016'}-{id:1,D:'5/25/2016'}-{id:2,D:'5/25/2016'}-{id:1 ,D:'5/26/2016'}
Distinct Sequenz:
{id:1,D:'5/25/2016'}-{id:2,D:'5/25/2016'}-{id:1,D:'5/26/2016'}
Es sei nun angenommen dass d Die Sequenz läuft lange, tatsächlich wird onComplete nie aufgerufen.
Wie verwaltet Rx es, so dass es nicht alle eindeutigen Elemente im Speicher zum Vergleich enthält?
Ich vermute, es hält etwas zurück Speicher für Elemente in seiner Pipeline. aber ich dachte immer, dass nachdem onNext mit dem nächsten Gegenstand aufgerufen wurde, dieser Gegenstand einfach entsorgt wird.
Noch, wenn es entsorgt, welche Elemente verwendet Rx für den EqualityComparer beim Aufruf des Distinct-Operators?
Distinct wird weiterhin Werte sammeln, die verglichen werden sollen, bis die Sequenz abgeschlossen ist. Es ist wahrscheinlich nicht das Werkzeug, das Sie wollen, oder Sie müssen die Sequenz entweder mit Window, TakeUntil + Repeat abschließen. Dies wird davon abhängen, wenn es akzeptabel ist Ihre Sammlung von Gegenständen neu zu starten (vielleicht täglich?) –
ich habe bereits, dass, wie in der Antwort unten vorgeschlagen. –
@LeeCampbell Entschuldigung, es wurde in den Kommentaren unten diese Antwort vorgeschlagen. Ich werde seine Antwort bearbeiten, um das –