Tengo una lista con algunos identificadores como este:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
Además, tengo otra lista de <T>
elementos, que están representados por los identificadores descritos anteriormente.
List<T> docs = GetDocsFromDb(...)
Necesito mantener el mismo orden en ambas colecciones, de modo que los elementos en List<T>
deben estar en la misma posición que en la primera (debido a razones de puntuación del motor de búsqueda). Y este proceso no se puede hacer en la GetDocsFromDb()
función.
Si es necesario, es posible cambiar la segunda lista a otra estructura ( Dictionary<long, T>
por ejemplo), pero preferiría no cambiarla.
¿Hay alguna forma simple y eficiente de hacer esta "orden según algunas ID" con LINQ?
c#
linq
sorting
collections
Borja López
fuente
fuente
docId
ocurre exactamente una vezdocs
, qué propiedad contendráId
o se requerirá un selectorFunc<T, long>
?Respuestas:
fuente
Id
. No se especifica en la pregunta.IndexOf
es perfectamente aceptable para su ejemplo y agradable y simple. Si tuviera muchos datos, mi respuesta podría ser más adecuada. stackoverflow.com/questions/3663014/…Como no especificas
T
,Es una extensión genérica para lo que quieres.
Podrías usar la extensión como esta quizás,
Una versión más segura podría ser
que funcionará si
source
no se comprime exactamente conorder
.fuente
La respuesta de Jodrell es la mejor, pero en realidad se volvió a implementar
System.Linq.Enumerable.Join
. Join también usa Lookup y sigue ordenando la fuente.fuente
Un enfoque simple es comprimir con la secuencia de pedido:
fuente
Zip
combina cada índice (en una Tupla) con el documento en la misma posición en la lista correspondiente. Luego, OrderBy clasifica las Tuplas por la parte del índice y luego la selección excava nuestros documentos de la lista ahora ordenada.Item1
no está relacionadoItem2
.