Ich arbeite an einem Algorithmus, der zwei Arten von Empfehlungen, Restaurants und Gerichte erzeugen kann. All dies funktioniert gut, aber ich wollte diese beiden Arten von Empfehlungen in einer einzigen Liste zusammenführen, wo ich auf einige Probleme stieß. Aus meiner vorherigen Frage kam ich zu dem Schluss, dass ich eine Wrapperklasse brauchte, die Ich habe es so eingerichtet:
%Vor%Nun möchte ich die zwei Arten von Empfehlungen wechseln, so dass die Liste wie folgt aussehen würde:
%Vor%Beachten Sie, dass diese Empfehlungen vollständig getrennt sind. Sie werden rein auf der Grundlage der Präferenzen des Benutzers generiert, und sie haben keine Korrelation zwischen ihnen. Mein Product Owner möchte diese Empfehlungen auf der Homepage unserer App so zeigen.
Diese Listen unterscheiden sich in der Länge. Wenn ich also alle Elemente aus einer Liste hinzugefügt habe, wollte ich einfach die restlichen Objekte aus der anderen Liste hinzufügen. Ein mögliches Szenario könnte so aussehen:
%Vor%Hier ist die Liste der Restaurantobjekte abgelaufen und ich wollte nur noch die restlichen Empfehlungen am Ende der Liste hinzufügen.
Ich bin so weit gekommen, aber ich bin mir nicht sicher, wie ich eine Ausnahme IndexOutOfBounds
abfangen und den Rest der verbleibenden Objekte am Ende hinzufügen würde.
Hat jemand eine Idee, wie ich das machen könnte? Könnte ich einfach eine Ausnahme IndexOutOfBounds
abfangen und .AddRange()
für die verbleibenden Objekte verwenden? Ich bin nicht sicher, wie ich überprüfen könnte, welche Liste außerhalb der Grenzen war.
Lassen Sie mich wissen, ob ich mehr ausarbeiten sollte und danke im Voraus!
Bearbeiten: -entfernt, weil es nicht fair war .-
Meine Empfehlung wäre, einfach einen impliziten Operator zu erstellen:
%Vor%Dann haben Sie die Möglichkeit, diese Typen einfach zu konvertieren:
%Vor%Danach können Sie einfach eine for-Schleife verwenden:
%Vor%Dies wird Ihre Arbeit viel einfacher machen.
Dies ist eine ziemlich prägnante Art, dies zu tun.
Obwohl es nicht Linq ist, arbeitet es im Geiste der Arbeitsweise von Linq, indem es jegliche Arbeit verzögert, bis die resultierende Sequenz aufgezählt ist:
%Vor% Wenn Sie das Paket MoreLinq
NuGet verwenden, das % co_de enthält % Erweiterungsmethode , stattdessen können Sie die folgende vereinfachte Implementierung verwenden:
Zusatz
Wie @InBetween in seiner Antwort geschrieben hat, können Sie die Interleaving-Logik in eine Erweiterungsmethode einfügen. Hier ist meine Version; Es ist im Wesentlichen das Gleiche, außer dass ich eine kleine Optimierung hinzugefügt habe, um den Aufruf von ZipLongest
zu vermeiden, wenn dies nicht notwendig ist:
Sobald Sie das haben, merkte ich, dass Sie keinen .MoveNext()
-Operator schreiben müssen. Stattdessen können Sie einfach die beiden Sequenzen in den resultierenden Typ konvertieren, bevor Sie implict
like so aufrufen:
Nun, es gibt wahrscheinlich elegantere LINQ-Lösungen, aber Sie haben bereits die meisten, es ist auch ein sehr effizienter Ansatz:
%Vor%