Сортировка коллекции в С#, индексы сравниваемых элементов

Пытаюсь отсортировать 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 шт):

Автор решения: Uranus

Вводить дополнительный параметр в 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();
→ Ссылка