2011-12-20 6 views
1

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

私は、これを行う最も速い(最も効率的な)方法が何であるか疑問に思っています。最初はSortedDictionaryを使い、次にSortedListを使うことを考えていましたが、SortedDictionariesはもっと高速です。

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

もしそうでない場合は、.Position.Xによれば、それらを追加/削除する際に、素早く並べ替えるために使用できるより優れた構造またはクラスがありますか? (私はリストにオブジェクトをたくさん追加/削除していますが、リストを使う前に、オブジェクトが追加されると並べ替える方がいいですか?

ありがとうございます。

編集:Infactは、すべてのオブジェクトが一意であるため、HashSetコレクションのいくつかの並べ替えはお勧めですか?ありがとう。

+0

並べ替えが必要なオブジェクトは、リストにいくつあると思われますか?何百、何百万? –

+0

上の数百;つまり、100と1000の間です。 – Xenoprimate

+0

私は、その場合、現代のクライアントでパフォーマンスの改善が小さくなる可能性が高いことを示しています。) 私のお金のために返すようにIComparableを実装します.Position.Xを使用し、簡単に並べ替えられたリストを使用します。 –

答えて

0

私たちは解決策の中で問題ドメインをモデル化してでこれを解決できます。あなたのドメインについて考えてみましょう。それはあなたが衝突可能なオブジェクトをレンダリングするキャンバス/グリッドですか、スケジューリングの問題を解決するために取り組んでいますか?それに基づいて、あなたのデータ構造を設計します。

我々のデータ構造のための目標ダウンリストをことができます -

  1. 我々はすぐにオブジェクトを挿入することができるはずです。
  2. オブジェクトにPosition.Xを効率的にアクセスできる必要があります。
  3. オブジェクトの位置をIDで効率的に取得できるはずです。

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

パブリッククラスMyCanvas { プライベートたIDictionary _positionMap =新しいSortedListのを(); プライベートIDictionary _objectMap =新しい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); 
} 

}

注 - コードがコンパイルされないことと、エラー処理、スレッドの問題などのような懸念が世話をする必要があることに注意してください。

関連する問題