Сортировка коллекции в С#, индексы сравниваемых элементов
Пытаюсь отсортировать List<Action> actionsList
по значению набора полей, GetActionPriority
возвращает совокупный "вес" набора:
actionsList.Sort((Action first, Action second) =>
GetActionPriority(first).CompareTo(GetActionPriority(second)));
но при этом - хотелось бы, чтобы при сортировке, элементы, добавленные в коллекцию позже (т.е. имеющие большее значение индекса в коллекции) не оказались в результате ближе к началу коллекции. Как бы actionsList.OrderBy(x=>GetActionPriority(x)).ThenOrderBy(<начальный индекс элемента в коллекции>)
. Пока не могу сообразить, как это сделать не вводя дополнительного параметра в Action, надеюсь на вашу помощь
p.s. нет уверенности, что встроенный алгоритм без дополнительных ограничений не изменит порядок элементов по первоначальному индексу
Ответы (1 шт):
Вводить дополнительный параметр в Action необязательно, если воспользоваться анонимным типом как оберткой и методом Select.
var sortedActionsList = actionsList
.Select((action, index) => new { Action = action, Index = index }) // Добавляем исходные индексы
.OrderBy(x => GetActionPriority(x.Action)) // Сортировка по приоритету
.ThenBy(x => x.Index) // Сортировка по исходному индексу для сохранения порядка
.Select(x => x.Action) // Возвращаем только элементы списка
.ToList();