Подтвердить что ты не робот

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

У меня есть два общих объекта списка, в которых один содержит идентификаторы и порядок, а другой - множество идентификаторов с каждым идентификатором во втором списке, имеющим ссылку на идентификатор для первого списка, например:

public class OptionType
{
    public int ID { get; set; }
    public int Ordering { get; set; }
}

public class Option
{
    public int ID { get; set; }
    public int Type_ID { get; set; }
}   

Очевидно, что я могу сделать простой вид в списке OptionTypes, выполнив

types_list.OrderBy(x => x.Ordering);

Вопрос, однако, как я могу упорядочить "options_list", используя "Type_ID" для объекта, который будет относиться к упорядочению типов_list. Как и во что-то вроде (очевидно, это неверно, но, надеюсь, вы получите эту идею!)

options_list.OrderBy(x => x.Type_ID == types_list.OrderBy(e => e.Ordering));
4b9b3361

Ответ 1

Вы можете использовать соединение для получения желаемого результата. Пример использования синтаксиса запроса.

var orderedOptions = from option in options_list
                     join type in types_list
                     on option.Type_ID equals type.ID
                     orderby type.Ordering
                     select option;

Ответ 2

List.FindIndex() - ваш друг, если вы работаете с небольшими списками:

var orderedB = listB.OrderBy(b => listA.FindIndex(a => a.id == b.id));

Рабочий пример: https://dotnetfiddle.net/CpLeFU

Как отметил MaxJ в комментариях, производительность будет большим кошмаром в больших списках. Используйте принятый ответ в этом случае.

Ответ 3

Мне нравится синтаксис Lambda, поэтому я придумал этот эквивалент. Я вижу, как синтаксис запроса является более чистым для соединений.

var orderedOptions = options_list
    .Join(
        types_list,
        option => option.Type_ID,
        type => type.ID,
        (option, type) => new { Option = option, Type = type })
    .OrderBy(x => x.Type.Ordering)
    .Select(x => x.Option);



Для небольшого сокращения (чего я не уверен) это создает новый объект только с свойством Ordering, а не для всего класса Type. Здесь не так много, но у меня был большой класс с данными сортировки, и мне нужно только свойство сортировки. Не знаю, было ли это важно, но было понятнее читать.

var orderedOptions = options_list
    .Join(
        types_list,
        option => option.Type_ID,
        type => type.ID,
        (option, type) => new { Option = option, Ordering = type.Ordering })
    .OrderBy(x => x.Ordering)
    .Select(x => x.Option);

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