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

У меня есть список с такими идентификаторами:

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

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

 List docs = GetDocsFromDb(...) 

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

При необходимости можно изменить второй список на другую структуру (например, Dictionary ), но я бы предпочел не изменять его.

Есть ли простой и эффективный способ сделать это «упорядочение в зависимости от некоторых идентификаторов» с LINQ?

    3 Solutions collect form web for “Сортировка списка из другого идентификатора списка”

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

    Поскольку вы не указываете T ,

     IEnumerable OrderBySequence( this IEnumerable source, IEnumerable order, Func 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 OrderBySequence( this IEnumerable source, IEnumerable order, Func 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 docs = GetDocsFromDb(...).Zip(docIds, Tuple.Create) .OrderBy(x => x.Item2).Select(x => x.Item1).ToList(); 
    Interesting Posts

    Обновлен ли Защитник Windows, если для Windows Update установлено ручное?

    Обнаружение голоса в приложении для Android

    Любые советы о том, что делать, когда вы получаете загадочный синий экран в окнах?

    Как отключить значок «Получить Windows 10» в области уведомлений (лоток)?

    Как получить только один файл из другого филиала

    Могут ли клиенты telnet или netcat связываться через SSL?

    Как я могу сделать рекурсивные шаблоны в AngularJS при использовании вложенных объектов?

    Почему C ++ поддерживает поэтапное назначение массивов внутри структур, но не в целом?

    Как получить общеansible IP-адрес пользователя в C #

    Что такое ошибка «контрольной суммы CMOS»?

    Есть ли простой способ синхронизации Thunderbird между машинами?

    Как обращаться с неправильным вводом типа данных

    Мелкозернистая конфигурация sudoers (допустимые аргументы командной строки)

    Конфигурация WCF без файла конфигурации

    MVC, кнопка отправки которого нажата

    Давайте будем гением компьютера.