1

我想保存一个CollidableActor对象的列表,按它们的属性“ .Position.X ”排序。

我想知道什么是最快(最有效)的方法。起初我想使用 SortedDictionary,然后是 SortedList,但我读到 SortedDictionaries 无论如何都更快。

现在我很困惑,因为我不知道我想要字典还是列表。此外,在实现IComparable接口并创建我的CompareTo()方法时,仅返回.Position.X就足够了吗?

如果没有,根据.Position.X,是否有更好的结构或类可以在我添加/删除它们时快速排序?(我会经常从列表中添加/删除对象;在添加对象时进行排序会更好,还是在使用列表之前进行更新?)。

谢谢你。

编辑:事实上,由于所有对象都是唯一的,某种 HashSet 集合是否可取?谢谢。

4

1 回答 1

0

我们可以通过对解决方案中的问题域进行建模来解决这个问题。想想你的领域,它是一个画布/网格,你想在上面渲染你的可碰撞对象,你是否试图解决调度问题?基于该设计您的数据结构。

让我们列出我们数据结构的目标 -

  1. 我们应该能够快速插入对象。
  2. 我们应该能够通过 Position.X 有效地访问对象。
  3. 我们应该能够通过对象的 ID 有效地获取对象的位置。

通过在您自己的类中封装排序列表和哈希表来创建您自己的满足这些目标的数据结构-

公共类 MyCanvas { 私有 IDictionary _positionMap = new SortedList(); 私有 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);
}

}

注意 - 请注意,代码可能无法编译,需要注意错误处理、线程问题等问题。

于 2011-12-20T11:22:40.303 回答