Listen mit einer for-Schleife zusammenführen

8

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.

%Vor%

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 .-

    
RandomStranger 15.12.2016, 08:38
quelle

6 Antworten

8

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.

    
m.rogalski 15.12.2016, 09:16
quelle
15

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:

%Vor%

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:

%Vor%

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:

%Vor%     
Matthew Watson 15.12.2016 09:05
quelle
6

Nun, es gibt wahrscheinlich elegantere LINQ-Lösungen, aber Sie haben bereits die meisten, es ist auch ein sehr effizienter Ansatz:

%Vor%     
Tim Schmelter 15.12.2016 08:51
quelle
5

Eine einfache Möglichkeit wäre:

%Vor%     
InBetween 15.12.2016 09:23
quelle
2

Nachdem Sie zwei Arrays von Restaurants und Gerichten des gleichen Typs RecommenderItem erstellt haben, können Sie die Zip-Methode wie folgt verwenden:

%Vor%     
PMerlet 15.12.2016 08:46
quelle
0

Restaurant und Dish müssten sich einen Basistyp teilen:

%Vor%

Sobald das der Fall ist, könnten Sie etwas wie diese leicht modifizierte Version von Zip (von System.Linq ) verwenden:

%Vor%     
eitamal 15.12.2016 09:04
quelle

Tags und Links