Ich habe eine Liste mit einigen Bezeichnern wie diesen:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
Außerdem habe ich eine andere Liste von <T>
Elementen, die durch die oben beschriebenen IDs dargestellt werden.
List<T> docs = GetDocsFromDb(...)
Ich muss in beiden Sammlungen die gleiche Reihenfolge einhalten, damit sich die Artikel in List<T>
derselben Position befinden wie in der ersten (aus Gründen der Suchmaschinenbewertung). Und dieser Vorgang kann in der GetDocsFromDb()
Funktion nicht durchgeführt werden .
Bei Bedarf ist es möglich, die zweite Liste in eine andere Struktur zu ändern ( Dictionary<long, T>
zum Beispiel), aber ich würde es vorziehen, sie nicht zu ändern.
Gibt es eine einfache und effiziente Möglichkeit, diese "Ordenation abhängig von einigen IDs" mit LINQ durchzuführen?
c#
linq
sorting
collections
Borja López
quelle
quelle
docId
genau einmal vorkommtdocs
, welche Eigenschaft wird die haltenId
oder wird ein SelektorFunc<T, long>
benötigt?Antworten:
quelle
Id
. Es ist nicht in der Frage angegeben.IndexOf
ist für Ihr Beispiel durchaus akzeptabel und nett und einfach. Wenn Sie viele Daten hätten, wäre meine Antwort möglicherweise besser geeignet. stackoverflow.com/questions/3663014/…Da Sie nicht angeben
T
,Ist eine generische Erweiterung für das, was Sie wollen.
Sie könnten die Erweiterung vielleicht so verwenden,
Eine sicherere Version könnte sein
was funktioniert, wenn
source
nicht genau mit ziporder
.quelle
Jodrells Antwort ist die beste, aber tatsächlich hat er sie neu implementiert
System.Linq.Enumerable.Join
. Join verwendet auch Lookup und ordnet die Reihenfolge der Quelle weiter.quelle
Ein einfacher Ansatz besteht darin, mit der Bestellreihenfolge zu zippen:
quelle
Zip
kombiniert jeden Index (zu einem Tupel) mit dem Dokument an derselben Position in der entsprechenden Liste. Dann sortiert der OrderBy die Tupel nach dem Indexteil und dann wählt die Auswahl nur die Dokumente aus der jetzt geordneten Liste aus.Item1
, ist in keinem ZusammenhangItem2
.