У меня есть два общих объекта списка, в которых один содержит идентификаторы и порядок, а другой - множество идентификаторов с каждым идентификатором во втором списке, имеющим ссылку на идентификатор для первого списка, например:
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));
Ответ 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);
Похоже, что синтаксис запроса позволяет вам заказывать в исходном запросе, а лямбда требует упорядочения после того, как соединение создает новый объект. Возможно, они действительно делают то же самое под обложками: создание объединенного объекта, который будет отсортирован, затем выбран.