Произвольная сортировка элементов с использованием внешнего списка приоритетов - PullRequest
2 голосов
/ 19 марта 2019

У меня есть список уникальных предметов, подобных этому:

List<Animals> ItemList = Cat, Dog, Bird, ...

Я пытаюсь отсортировать его, используя внешний список приоритетов, например:

List<Animals> PriorityList = Dog, Cat, Bird, ...

Я обнаружил, что яможно правильно сортировать элементы следующим образом:

ItemList.OrderBy(i => i == Dog).ThenBy(i => i.Cat).ThenBy(i => i.Bird)...

Но масштабируемость такого подхода ужасно плоха;У кого-нибудь есть идеи, как это сделать, используя LINQ и PriorityList?

Ответы [ 2 ]

6 голосов
/ 19 марта 2019

Вы можете упорядочить элементы по их индексу в другом списке:

var orderedList = ItemList.OrderBy(i => PriorityList.IndexOf(i)).ToList();

Однако, если элемент случается с , а не , он вообще находится в списке приоритетов, тогда этот элементбудет первым, потому что IndexOf вернет -1 для элемента, который не существует.Если вы предпочитаете, чтобы они приходили последними, то вы можете проверить, содержит ли список элемент первым, а если нет, вернуть большее число, например int.MaxValue или PriorityList.Count:

var ordered = items
    .OrderBy(i => priorities.Contains(i) ? priorities.IndexOf(i) : int.MaxValue)
    .ToList();
1 голос
/ 19 марта 2019

Если стоимость поиска приоритета значительна (помните, что есть O (n log n) сравнений, с двумя поисками на сравнение), тогда выполняйте этот поиск один раз вариант. Кортежи избегают необходимости создавать тип для хранения промежуточного результата.

var ordered = ItemList
               .Select(i => (item: i, priority: PriorityList.IndexOf(i))
               .OrderBy(i => i.priority)
               .Select(i => i.item)
               .ToList();

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

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