Сортировка по адресу памяти возможна только по эталонным объектам. Так что не все типы можно сортировать таким образом, а примитивные типы и структуры - нет.
Другой способ - это зависеть от определенного интерфейса, где вам требуется, чтобы каждый из этих экземпляров мог возвращать Guid. Это создается в конструкторе и не изменяется.
public interface ISortable
{
Guid SortId { get; }
}
class Foo : ISortable
{
Foo()
{
SortId = Guid.NewGuid();
}
Guid SortId { get; private set; }
}
Преимущество guid в том, что его можно создавать независимо в каждом классе. Вам не нужна синхронизация, вы просто присваиваете каждому классу идентификатор.
Кстати: если вы используете объекты в Словаре в качестве Ключа, они не должны изменять свой хэш-код. Они должны быть неизменными. Вероятно, это может быть ограничением, от которого вы можете зависеть.
Редактировать: Вы можете написать свой специализированный список, который может хранить заказы.
Либо вы сохраняете исходный порядок при создании списка из другого списка, а затем вы можете восстановить порядок в любой момент времени. Новые предметы могут быть поставлены в конце. (есть новинки в любом случае?)
Или вы делаете что-то более сложное и сохраняете порядок любого объекта, который когда-либо был виден вашим списком, в статической памяти. Затем вы можете отсортировать все списки независимо. Но остерегайтесь ссылок, которые вы держите, чтобы избежать очистки объектов GC. Вам понадобятся недельные ссылки, я думаю, что в C # есть слабые ссылки, но я никогда не использовал их.
Еще лучше было бы поместить эту логику в класс сортировки. Так что это работает для каждого списка, который был отсортирован вашим классом сортировки.