Tri d'une liste à partir d'une autre liste des Id
J'ai une liste avec des identifiants comme ceci:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
Plus, j'ai une autre liste de <T>
éléments, qui sont représentés par les id décrit ci-dessus.
List<T> docs = GetDocsFromDb(...)
J'ai besoin de garder le même ordre dans les deux collections, de sorte que les éléments en List<T>
doit être dans la même position que dans le premier (en raison de moteur de recherche de notation raisons). Et ce processus ne peut pas être fait dans le GetDocsFromDb()
fonction.
Si nécessaire, il est possible de modifier la deuxième liste dans une autre structure (Dictionary<long, T>
par exemple), mais je préfère ne pas la modifier.
Est-il un moyen simple et efficace de faire cela "ordenation selon certains Identifiants" avec LINQ?
- êtes-vous assuré que chaque
docId
se produit exactement une fois dansdocs
, quels sont les biens tiendra leId
ou un sélecteur deFunc<T, long>
être nécessaire? - La première liste de représenter une "liste principale"? Un autre termes, la seconde liste sera un sous-ensemble représentant une partie (ou la totalité) de la première liste?
Vous devez vous connecter pour publier un commentaire.
Id
. Ses pas précisé dans la question.IndexOf
est parfaitement acceptable pour votre exemple, et de simple et sympathique. Si vous avez eu beaucoup de données, ma réponse pourrait être mieux adapté. stackoverflow.com/questions/3663014/...Puisque vous ne spécifiez pas de
T
,Est une extension générique pour ce que vous voulez.
Vous pourriez utiliser l'extension comme cela, peut-être,
Plus sûr de version peut être
qui fonctionne si
source
n'zip exactement avecorder
.Jodrell de réponse est meilleur, mais en fait il réimplémentée
System.Linq.Enumerable.Join
. Rejoignez également les utilisations de Recherche et de garde de commande de la source.Une approche simple consiste à zip avec la séquence de tri:
Zip
combine chaque indice (dans un Tuple) avec le document dans la même position dans la liste correspondante. Puis le OrderBy trie les Tuples par la partie de l'index, puis le sélectionner fouilles notre juste les docs de la liste ordonnée.Item1
est pas lié à laItem2
.