C#汎用ハッシュセット< T>検索のパフォーマンスはO(1)、ObservableCollectionの検索のパフォーマンスはO(n)でなければなりません。C#HashSet <T>(ObservableCollectionと比較して)<T>?
私は大量の一意の要素を持っていますが、各要素には一意ではないDateTimeプロパティがあります。
各要素は、単純にDateTime.GetHashCode()を返すことによってHashCodeを計算します。
今、データのサブセットを取得したいとします。私は300.000要素のコレクションにこのLINQクエリを実行する場合は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;
の間で日付を持っているすべての要素、それは与えられた範囲内にある80個の要素を返すために〜25ミリ秒かかります - HashSet < T>またはObservableCollection < T>を使用するかどうかは関係ありません。
すべての要素を手動でループしてチェックすると、〜25 msという同じ時間がかかります。
しかし、私は、指定された範囲内のすべての日付のHashCodeを知っています。私のHashSet < T>から、指定されたHashCodesを持つすべての要素を取得することは可能ですか?私はそれがはるかに速くなると思う...
LINQクエリをスピードアップすることは可能ですか?私はそれが私のHashSetの特別な能力を利用しないと仮定します< T>?
各要素のハッシュコードはその日付ですか? – Jodrell
HashSetには、日付が範囲内にある要素を効率的に取得できる特殊な機能はありません。 HashSetを使用すると、特定のオブジェクトまたは値がセット内にあるかどうかを迅速に判断できます。 –
hatchet
私の最初の観察は、オブジェクトが異なる場合に可能な限りハッシュコードが異なるはずです(これは必ずしも当てはまるとは限りませんが、あなたが目指すものです)。あなたの場合、これはそうではありません。同一のハッシュコードを持つ異なる要素がありますが、それらは悪いです。最悪の場合、3つのユニークな日付しかない場合、ハッシュセットは3つのバケットしか持たないので、ハッシュセットで何かを見つけると、そのバケット内のすべての要素をソートしてO(n) )。また、これは一般的なメモであり、質問に直接関係していないことに注意してください:) – Chris