Сортировка списка на основе другого списка - PullRequest
27 голосов
/ 12 августа 2010

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

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' для объекта, который бы относился к упорядочиванию types_list. Как в чем-то вроде (очевидно, это не верно - но, надеюсь, вы поймете идею!)

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

Ответы [ 3 ]

34 голосов
/ 12 августа 2010

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

var orderedOptions = from option in options_list
                     join type in types_list
                     on option.Type_ID equals type.ID
                     orderby type.Ordering
                     select option;
17 голосов
/ 30 мая 2016

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

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

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

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

9 голосов
/ 28 ноября 2012

Мне нравится лямбда-синтаксис, поэтому я придумал этот эквивалент.Я могу видеть, как синтаксис запроса чище для объединений.

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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...