Сортировка списка из другого списка идентификаторов
у меня есть список идентификаторов, как это:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
более того, у меня есть еще один список <T>
элементы, которые представлены идентификаторами, описанными выше.
List<T> docs = GetDocsFromDb(...)
мне нужно сохранить такой же порядок в обеих коллекциях, так что List<T>
должен быть в том же положении, что и в первом (из-за причин скоринга поисковой системы). И этот процесс не может быть выполнен в
3 ответа:
так как вы не указываете
T
,IEnumerable<T> OrderBySequence<T, TId>( this IEnumerable<T> source, IEnumerable<TId> order, Func<T, TId> idSelector) { var lookup = source.ToDictionary(idSelector, t => t); foreach (var id in order) { yield return lookup[id]; } }
является общим расширением для того, что вы хотите.
вы могли бы использовать расширение, как это возможно,
var orderDocs = docs.OrderBySequence(docIds, doc => doc.Id);
более безопасная версия может быть
IEnumerable<T> OrderBySequence<T, TId>( this IEnumerable<T> source, IEnumerable<TId> order, Func<T, TId> idSelector) { var lookup = source.ToLookup(idSelector, t => t); foreach (var id in order) { foreach (var t in lookup[id]) { yield return t; } } }
который будет работать, если
source
не застегивается точно сorder
.