Сортировка списка из другого списка идентификаторов


у меня есть список идентификаторов, как это:

List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };

более того, у меня есть еще один список <T> элементы, которые представлены идентификаторами, описанными выше.

List<T> docs = GetDocsFromDb(...)

мне нужно сохранить такой же порядок в обеих коллекциях, так что List<T> должен быть в том же положении, что и в первом (из-за причин скоринга поисковой системы). И этот процесс не может быть выполнен в

3 78

3 ответа:

docs = docs.OrderBy(d => docsIds.IndexOf(d.Id)).ToList();

так как вы не указываете 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.

один простой подход-это zip с порядковой последовательностью:

List<T> docs = GetDocsFromDb(...).Zip(docIds, Tuple.Create)
               .OrderBy(x => x.Item2).Select(x => x.Item1).ToList();