Из рук вон я не особо вижу, что вы могли бы сделать, чтобы сделать его быстрее, за исключением того, чтобы избегать как можно большего вызова этого метода, поскольку сортировка и перестройка списков по своей сути медленны :-). Одним из возможных вариантов будет использование SortedSet, который будет поддерживать коллекцию в отсортированном порядке и, таким образом, поможет вам избежать затрат, связанных с повторным обращением при каждом изменении коллекции. Не очень помогает, хотя, я полагаю, когда вы меняете стратегию сортировки (хотя я бы поспорил, что разработчики SortedSet немного подумали, когда писали код).
Полагаю, это на самом деле не отвечает на ваш вопрос, но вместо передачи IComparer вы могли бы вместо этого передать Func <...> в ваш метод Order () (и исключить перечисление IndexOrdering), а затем передать это Func прямо в метод OrderBy ()? Это позволит вам выражать все виды сумасшедших методов сортировки, не касаясь этого класса, и вы сможете удалить из этого класса ненужный багаж состояния (например, _rnd, если он больше нигде не используется).
Что-то вроде:
public class RatioBag : IList<RatioAssociation>
{
private readonly IList<RatioAssociation> _items = new List<RatioAssociation>();
public void Order(Func<RatioAssociation, int> func) {
var ordered = _items.OrderBy(func);
_items.Clear();
((List<RatioAssociation>)_items).AddRange(ordered);
}
}
тогда, чтобы назвать это:
var myCollection = new RatioBag();
myCollection.Order(item => item.PropertyX);
myCollection.Order(item => item.PropertyY);
var r = new Random();
myCollection.Order(item => r.Next());
Решение IComparer также позволило бы получить аналогичное решение.
Надеюсь, это поможет.
Nate