2011-02-07 4 views
3

私が検索したフィールドにList<T>をソートすると、検索が高速になります。 オブジェクトモデルでList<Person>が10.000で、List<Car>が10.000であるとします。 モデルのPersonsリストをループし、c.Owner == person.Nameというプロパティを持つCarを探したいとします。ソートされたリスト<T>を私が検索したフィールドでソートすると、より速く検索できますか?

public static Car Car(Model model, Person person) 
     { 
      return model.Cars.Find(
       delegate(Car c) 
       { 
        return c.Owner.Equals(person.Name); 
       }); 
     } 

プロパティー所有者の車のリストをソートしてもループが速くなりませんか?

BinarySearchを使用する必要がありますが、BinarySearchのオーバーロードは代理人を許可しないと考えました。 überhauptとは何ですか?BinarySearchを使用して、あなたがパラメータとして検索したいCarを与えなければならない場合はどうですか?

+0

辞書... ... –

答えて

5

List<T>.BinarySearchは、代理人を受け入れませんが、になります。an overloadにはIComparer<T>を受け取ります。適切なカスタム比較(CarByOwnerComparer : IComparer<Car>)でそのオーバーロードを使用して、目的の方法で検索します。もちろん、リストはである必要があります。バイナリ検索を有効にするためには、この比較文字でソートされたが既にソートされている必要があります。インターフェイスを実装するためにデリゲート(ラムダなど)を書くことを好む場合は、ここで提供されているProjectionComparerなど、2つの間で変換できるコンバータを使用することを検討してください。

しかし、より適切なコレクションクラスを使用することをお勧めします。これは、キーによる高速検索を提供します。たとえば、SortedList<,>SortedDictionary<,>はどちらもO(logn)でジョブを実行します。注文が真の要件でない場合は、Dictionary<,>と一緒に行くほうがずっと簡単です。

+0

答えの最初の部分についてIComparer を使用しましたが、私はBinarySearchでデリゲートを使用できないことを発見しました。だから私はインターフェイスIComparer (私はあなたが意味するインターフェイスだと思います)を書く方法を理解していません。私はフィールドの異なる組み合わせについてルックアップを行わなければならないので、ループのルックアップとルックアップの前に別のソートを行うことを考えました。 – Gerard

+0

あなたの答えの後半について。私はSortedDictionaryを考慮しましたが、異なるキーセットを使用できるようにしなければなりません - すべてのキーを変更することは可能であるとか、感知できないと思いますか?または、キーをいくつかの設定によって異なる値を持つファサードにすることはできますか? – Gerard

+0

@ジェラード:私はそれを理解するのが難しいと思っています。とにかく、簡単なコメントで答えることができないのではないかと思います。 (私が言うことができる最高の:はい、複数のプロパティをカプセル化し、キーとして使用するクラスを書くことができます)。これらの問題を明確にする別の質問をすることをお勧めしますか?乾杯。 – Ani

関連する問題