C# の汎用 HashSet<T> 検索パフォーマンスは O(1) である必要があり、ObservableCollection<T> の検索パフォーマンスは O(n) である必要があります。
大量の一意の要素があり、各要素には一意ではない DateTime プロパティがあります。
各要素は、DateTime.GetHashCode() を返すだけで HashCode を計算します。
ここで、データのサブセット、たとえば 2012 年 3 月から 2012 年 6 月までの日付を持つすべての要素を取得したいと考えています。
var result = from p in this.Elements
where p.Date >= new DateTime(2012, 03, 01) &&
p.Date <= new DateTime(2012, 30, 06
select p;
この LINQ クエリを 300.000 要素のコレクションに対して実行すると、指定された範囲内の 80 要素を返すのに約 25 ミリ秒かかります。HashSet<T> と ObservableCollection<T> のどちらを使用しても問題ありません。
すべての要素を手動でループしてチェックすると、同じ時間、約 25 ミリ秒かかります。
しかし、指定された範囲内にあるすべての Dates の HashCode は知っています。HashSet<T> から指定された HashCodes を持つすべての要素を取得することは可能ですか? その方が早いと思いますが…
LINQ クエリを高速化することは可能ですか? 私の HashSet<T> の特別な能力を利用していないと思いますか?