C# Сортировка объектов по значению

Я хочу сохранить список объектов CollidableActor, отсортированных по их свойству ".Position.X".

Мне интересно, какой будет самый быстрый (самый эффективный) способ сделать это. Сначала я думал об использовании SortedDictionary, а затем SortedList, но я читал, что SortedDictionaries в любом случае быстрее.

Теперь я в замешательстве, потому что не знаю, нужен ли мне словарь или список. Кроме того, при реализации интерфейса IComparable и создании метода CompareTo() будет ли достаточно просто вернуть .Position.X?

Если нет, есть ли лучшая структура или класс, который я мог бы использовать, чтобы быстро сортировать вещи по мере их добавления/удаления в соответствии с .Position.X? (Я буду часто добавлять/удалять объекты из списка; будет ли лучше сортировать по мере добавления объектов или после обновления, прежде чем использовать список?).

Спасибо.

Редактировать: На самом деле, поскольку все объекты будут уникальными, будет ли целесообразна какая-то коллекция HashSet? Спасибо.


person Xenoprimate    schedule 20.12.2011    source источник
comment
Сколько объектов может быть в вашем списке, требующих сортировки? Десятки, сотни, миллионы?   -  person    schedule 20.12.2011
comment
Верхние сотни; то есть от 100 до 1000.   -  person Xenoprimate    schedule 20.12.2011
comment
Я вижу, в этом случае, вероятно, любое улучшение производительности будет небольшим на современном клиенте (это говорит о том, что вы знаете свои настройки лучше, чем я :)). За свои деньги я бы реализовал IComparable для возврата .Position.X и просто использовал бы отсортированный список для простоты - именно так, как вы предлагаете.   -  person    schedule 20.12.2011


Ответы (1)


Мы можем решить эту проблему, моделируя предметную область в решении. Подумайте о своем домене, это холст / сетка, на которой вы хотите визуализировать свои коллидирующие объекты, вы пытаетесь решить проблему планирования? На основе этого спроектируйте свою структуру данных.

Давайте перечислим цели для нашей структуры данных —

  1. Мы должны иметь возможность быстро вставлять объекты.
  2. Мы должны иметь возможность эффективно обращаться к объектам с помощью Position.X.
  3. Мы должны иметь возможность эффективно получать позицию объекта по его идентификатору.

Создайте собственную структуру данных, соответствующую этим целям, путем инкапсуляции отсортированного списка и хэш-таблицы в свой собственный класс.

открытый класс MyCanvas { частный IDictionary _positionMap = новый SortedList(); private IDictionary _objectMap = new HashTable();

public void Add(MyObject obj)
{
     _positionMap.Add(obj.Location.X, obj);
     _objectMap.Add(obj.Id, obj);
}

public MyObject GetPositionById(string id)
{
     return _objectMap[id].Location.X;
}

public IEnumerable<MyObject> SortedByX()
{
     _positionMap.GetEnumerator();
}

public void Delete(string id)
{
     var obj = _objectMap[id];
     _locationMap.Remove(obj.Location.X);
     _objectMap.Remove(id);
}

}

Примечание. Обратите внимание, что код может не компилироваться, и необходимо позаботиться о таких проблемах, как обработка ошибок, проблемы с потоками и т. д.

person Unmesh Kondolikar    schedule 20.12.2011