1

プロパティ " .Position.X " でソートされたCollidableActorオブジェクトのリストを保持したいと考えています。

これを行うための最も迅速な(最も効率的な)方法は何だろうと思っています。最初は、SortedDictionary を使用してから、SortedList を使用することを考えていましたが、SortedDictionaries の方がとにかく高速であると読みました。

辞書とリストのどちらが必要なのかわからないため、混乱しています。また、IComparableインターフェイスを実装し、CompareTo()メソッドを作成する場合、 .Position.Xを返すだけで十分でしょうか?

そうでない場合は、.Position.Xに従って、追加/削除するときにすばやくソートできる、より良い構造またはクラスがありますか? (リストからオブジェクトを頻繁に追加/削除します。リストを使用する前に、オブジェクトが追加されたとき、または更新されたときに並べ替えたほうがよいでしょうか?)

ありがとうございました。

編集:実際、すべてのオブジェクトが一意になるため、ある種の HashSet コレクションが推奨されますか? ありがとう。

4

1 に答える 1

0

これは、ソリューション内の問題ドメインをモデル化することで解決できます。ドメインについて考えてみてください。衝突可能なオブジェクトをレンダリングするキャンバス/グリッドですか?スケジューリングの問題を解決しようとしていますか? それに基づいて、データ構造を設計します。

データ構造の目標をリストアップしましょう -

  1. オブジェクトをすばやく挿入できるはずです。
  2. Position.X でオブジェクトに効率的にアクセスできるはずです。
  3. Id によってオブジェクトの位置を効率的に取得できるはずです。

独自のクラスでソートされたリストとハッシュテーブルをカプセル化することにより、これらの目標を満たす独自のデータ構造を作成します-

public class 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 に答える