2011-02-25 9 views
2

効率的なo(1)で検索アルゴリズムを実装する必要があります。私がHashSetを使用し、User.FirstNameによる検索を試してみると、それは正しいですか?そうでない場合は、アドバイスをお願いします。どうすればこの検索を実現できますか?一般的な検索速度

+1

代わりに、おそらく 'Dictionary 'が必要です。 –

+2

@Ben:あなたがFirstNameを使っているのであれば、重複したキーを取得するので... –

+0

@Reed:本当に、あなたは 'unordered_multimap'の行に沿って何かをしたいと思います。 。ネット。 –

答えて

3

Dictionary<TKey,TValue>を使用する必要があります。TKeyは検索タイプに基づいています。ただし、検索用語にFirstNameのようなものを使用している場合は、同じキーで複数の値があると問題が発生する可能性があります。

ILookupを生成するには、ToLookupを使用することをお勧めします。たとえば:

IEnumerable<Person> people = GetPeople(); 

var nameLookup = people.ToLookup(p => p.FirstName); 

それからんでした:

var peopleNamedFred = nameLookup["Fred"]; 
foreach(var fred in peopleNamedFred) 
    Console.WriteLine("{0} {1}, fred.FirstName, fred.LastName); 
+0

LookUpは不変です。それはいくつかの用途にはいいですが、他の用途では使用できません。 – CodesInChaos

+0

@CodeInChaos:True - データが変更された場合は、 'ILookup'を再生成する必要があります。つまり、必要に応じて、 'Dictionary 'を使っていつでも自分のILookupを作ることができます。 –

0

System.Collections.ObjectModel.KeyedCollectionの実装を作成します。
MSDN referenceによると、O(1)インデックス検索とO(1)に近づくキー検索の両方を提供します。しかし、それでも、HashTableには重複キーが許されないという制限があります。鍵の値が重複する必要がある場合や、異なる時間に異なる項目を鍵として使用する必要がある場合は、Reed Copseyが非常に優れたソリューションを提供します。

関連する問題