ためBinarySearchを使用する方法:リストBinarySearchのこのオーバーロードで始まるレッツ一覧<T>
public int BinarySearch(T item, IComparer<T> comparer);
よくリストはBinarySearchを使用する前に、appropiateたIComparerでソートする必要があることが知られています。しかし:リストを検索するには、Tアイテムを提供する必要があります。これは、これらの項目のプロパティに基づいて(つまり、Linqまたはデリゲート/述語を使用して)リスト内の項目を検索する場合には、むしろ予期しないことです。私のTアイテムをすでに持っているとき、私はそれを検索する必要はありません!
私はC#でC++コードを実装していましたが、C++プログラマはC++スタイルのバイナリ検索をコード内のどこでも以下のように使用していました。最初に彼は新しいTアイテムを作って、このTアイテムに彼が探していたプロパティを与えました。次に彼はそれを使ってリストを検索し、という同じプロパティを持つリスト内のアイテムのインデックスであるを見つけました。もちろん、C++の比較者はこれらのプロパティに適合していました。
これは、リスト内の項目を参照するのとはかなり異なる方法です。 BinarySearchはダミー Tアイテムを作成し、リスト内の実際の Tアイテムを取り出すためのインデックスを検索します。 Linqの観点からは、これは不自然に感じる。
私の質問は以下のとおりです。
私はBinarySearch背後にあるアイデアの正しい説明を与えましたか?
ダミーのTアイテムを最初に作成せずに、BinarySearchでLinqスタイルの検索を使用することは可能でしょうか?
これは特定のT、それに関するすべてのドキュメントでのみ有効ですか? – Gerard
すべてのエンティティに対して(実際に)1つの汎用作成メソッドを持つことはできません。さまざまな数のコンストラクタパラメータを持つクラスがあります。どちらを自動的に選択しますか?どのようにパラメータを自動的に供給しますか?あなたが制限することができる構造体とパラメータのないクラスは簡単です。その点では、Tは何でもかまいませんので、単純にダミーTを作成するのは簡単です(IMHO)。 –
「T:Basetype」という一般的な構文と、ラッパーがBasetypeのconstuctorsを使用するのに役立つのでしょうか? – Gerard