C # Сортировка объектов по значению - PullRequest
1 голос
/ 20 декабря 2011

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

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

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

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

Спасибо.

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

1 Ответ

0 голосов
/ 20 декабря 2011

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

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

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

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

публичный класс MyCanvas { private IDictionary _positionMap = new 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);
}
* *} Тысяча двадцать-один

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

...