Sortieren einer Liste aus einer anderen Liste-IDs
Habe ich eine Liste mit einigen Bezeichner wie diese:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
Außerdem habe ich eine andere Liste von <T>
Positionen, die vertreten werden durch die ids wie oben beschrieben.
List<T> docs = GetDocsFromDb(...)
Ich brauche, um die gleiche Reihenfolge in beiden Sammlungen, so dass die Elemente in List<T>
müssen in der gleichen position, als in der ersten (durch Suchmaschinen-scoring-Gründen). Und dieser Prozess kann nicht getan werden in der GetDocsFromDb()
Funktion.
Wenn nötig, ist es möglich, ändern Sie die zweite Liste in eine andere Struktur (Dictionary<long, T>
zum Beispiel), aber ich würde es vorziehen, nicht zu ändern.
Gibt es eine einfache und effiziente Möglichkeit, dies zu tun "ordenation je einige IDs" mit LINQ?
docId
tritt genau einmal in docs
, welche Eigenschaft halten Sie die Id
oder wird ein Selektor Func<T, long>
erforderlich?Nicht in der ersten Liste vertreten eine "master-Liste"? Anderen Worten, wird in der zweiten Liste eine Teilmenge darstellt einen Teil (oder die Gesamtheit) der ersten Liste?
InformationsquelleAutor Borja López | 2013-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Id
. Seine nicht in Frage.eine kurze Notiz. Sie erwähnen an Effizienz in Frage.
IndexOf
ist vollkommen akzeptabel für dein Beispiel und schön und einfach. Wenn Sie hatte eine Menge von Daten, die meine Antwort möglicherweise besser geeignet. stackoverflow.com/questions/3663014/...Ich habe zudem diese Methode und die mit dem Wörterbuch (siehe unten) und es ist fast doppelt so schnell.
Fantastisch. Vielen Dank; genau das, was ich suchte.
Ziemlich ineffizient - IndexOf aufgerufen wird für jedes element in der quellauflistung und OrderBy hat, um die Reihenfolge der Elemente. Die Lösung von @Jodrell ist viel schneller.
InformationsquelleAutor Denys Denysenko
Da Sie nicht angeben
T
,Ist eine generische Erweiterung für das, was Sie wollen.
Könnten Sie die Erweiterung, wie dies vielleicht
Einer sichereren version könnte
die Arbeit, wenn
source
nicht zip genau mitorder
.InformationsquelleAutor Jodrell
InformationsquelleAutor Kladzey
Eine einfache Methode ist die zip mit der Reihenfolge:
Da
Zip
verbindet jede index (in einem Tupel), die mit dem Dokument in der gleichen position in der entsprechenden Liste. Dann den OrderBy sortiert den Tupeln durch den index-Teil und dann die wählen Sie gräbt unsere nur die docs aus der geordneten Liste.aber, das Ergebnis GetDocsFromDb ist ungeordnet, so dass Sie erstellen werden-Tupeln, wobei
Item1
ist unabhängig vonItem2
.Ich denke, das wird produzieren falsche Ergebnisse, da bei der Durchführung auf die id und nicht den index.
InformationsquelleAutor Albin Sunnanbo