J'ai une liste avec des identifiants comme celui-ci:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
Morover, j'ai une autre liste d' <T>
éléments, qui sont représentés par les identifiants décrits ci-dessus.
List<T> docs = GetDocsFromDb(...)
Je dois garder le même ordre dans les deux collections, de sorte que les éléments dans List<T>
doivent être dans la même position que dans la première (pour des raisons de notation des moteurs de recherche). Et ce processus ne peut pas être effectué dans la GetDocsFromDb()
fonction.
Si nécessaire, il est possible de changer la deuxième liste en une autre structure ( Dictionary<long, T>
par exemple), mais je préfère ne pas la changer.
Existe-t-il un moyen simple et efficace de faire cette «classification en fonction de certains ID» avec LINQ?
c#
linq
sorting
collections
Borja López
la source
la source
docId
se produit exactement une foisdocs
, quelle propriété tiendra leId
ou un sélecteurFunc<T, long>
sera-t-il nécessaire?Réponses:
la source
Id
. Ce n'est pas spécifié dans la question.IndexOf
est parfaitement acceptable pour votre exemple et agréable et simple. Si vous aviez beaucoup de données, ma réponse serait peut-être mieux adaptée. stackoverflow.com/questions/3663014/…Puisque vous ne spécifiez pas
T
,Est une extension générique pour ce que vous voulez.
Vous pouvez peut-être utiliser l'extension comme celle-ci,
Une version plus sûre pourrait être
qui fonctionnera si
source
ne ferme pas exactement avecorder
.la source
La réponse de Jodrell est la meilleure, mais en fait, il a réimplémenté
System.Linq.Enumerable.Join
. Join utilise également Lookup et continue de classer la source.la source
Une approche simple consiste à compresser avec la séquence de commande:
la source
Zip
combine chaque index (dans un tuple) avec le document à la même position dans la liste correspondante. Ensuite, OrderBy trie les tuples par la partie d'index, puis la sélection ne creuse que les documents de la liste maintenant ordonnée.Item1
n'y a aucun rapportItem2
.