Ich habe eine Funktion zum Ersetzen einer einzelnen Entität in einem Repository (z. B. einer Datenbank) durch eine andere Entität. Dies gibt eine Aufgabe zurück, deren Ergebnis anzeigt, ob eine Ersetzung erfolgreich war.Convert IDictionary <T, Aufgabe <bool>> zu IObservable <KeyValuePair <T, bool>>
Jetzt sagen, ich möchte die gleiche Funktion erstellen, aber mehrere Elemente zu ersetzen. Meine Idee für eine Funktion Unterschrift war:
// Multiple Replace
IObservable<KeyValuePair<Entity, bool>> Replace(IDictionary<Entity, Entity> Map);
Karte enthält ein Wörterbuch, dessen Schlüssel die Einheiten, die ersetzt werden soll, und seine Werte sind die neuen Einheiten, die die alten ersetzen sollen.
Jedes KeyValuePair dieser Karte Wörterbuch sollte ein KeyValuePair < Entity zurückkehren, bool>, wobei die Taste entspricht Map.Key (= die Entitiy, die ersetzt werden sollen) und Wert ein Bool ist, ob der Ersatz erfolgreich war anzeigt oder nicht.
Ich mag würde dies als Stream zurück, daher wählte ich IObservable < KeyValuePair < Entity, bool>>, ein KeyValuePair < Entity Ausschieben, bool> für jedes Ergebnis, das zur Verfügung steht.
Für jetzt möchte ich nur die Funktion "Mehrere ersetzen" nutzen die "Single Replace" -Funktion zu konvertieren; Aber wie kann ich diese Anrufe machen und das Ergebnis im gewünschten Format zurückgeben?
Task<bool> Replace(Entity e, Entity Other)
{
// ... do the work ...
}
IObservable<KeyValuePair<Entity, bool>> Replace(IDictionary<Entity, Entity> Map)
{
// How this should work:
// for each KeyValuePair in Map, call the Single Replace function
// and - once available - return its result (bool) mapped to the Entity in the
// resulting Observable stream
IDictionary<Entity, Task<bool>> dict = Map.ToDictionary(x => x.Key, x => Replace(x.Key, x.Value));
// .. now what? How can I now convert the dict into an IObservable<KeyValuePair<Entity,bool>> ?
}
Würde mich über Hinweise freuen!
Ich bin nicht so vertraut mit den Reactive-Erweiterungen - in der Tat war mir nicht einmal die 'ToObservable()' und 'Merge()' Methoden bekannt, die das Szenario ziemlich viel zu vereinfachen scheinen. Meine einzige Sorge könnte sein, dass das Obige eine Sequenz von Observablen erzeugt und nicht auf einer Sequenz beobachtbar ist; letzteres könnte _leicht_ effizienter sein. Aber IMHO, Code-Klarheit ist viel wichtiger, so dass Sie ein echtes und signifikantes Leistungsproblem beweisen müssen, bevor Sie sich darüber Gedanken machen. –
Auf jeden Fall verzichtet mein Beispiel auf Feinheiten wie die Fehlerbehandlung, die die Motivation, diese anstelle der eingebauten Operatoren zu nutzen, nur weiter untergräbt. Ich bin froh, dass der Hauptpunkt meiner Antwort Sie dahin gebracht hat, wohin Sie gehen mussten. :) –