2012-12-30 14 views
5

私は、特定の値を処理した場合、追跡する必要がある状況に遭遇します。このような場合は、私が処理した値を追跡するのにDictionary(Of TKey, TValue)を使用します。基本的には、各値が処理されるときに、処理された値をキーとして辞書に挿入します。その値を処理したかどうかを確認したい場合は、ContainsKeyメソッドを使用して、値がコレクションに存在するかどうかを確認します。早送りキー検索を行う辞書の代わりに?

これはうまくいきますが、キーと値のペアの値の側に何かを挿入する必要があります。 List(Of T)を使用しますが、Dictionaryが提供するハッシュテーブル参照のパフォーマンスが必要です。 .Netには、この目的に適したデータコレクションがありますか?

+0

「TValue」に使用できる2次キーはありますか?そうでない場合は、 'List 'と述語を使って検索することが最善の方法です。 – casperOne

+0

@casperOne:いいえ、鍵が必要です。 – poke

+0

既に1つのプロパティをキーイングしていて、グループ内の項目を区別する2つ目のプロパティがない場合(実際にここでグループ化しています)、辞書はあなたを助けません。 – casperOne

答えて

15

私はHashSet<T>を提案します。あなたが知る必要があるのは、キーがすでに使用されているということだけであれば、キーを入力することができます。

それはあまりにも、本当に簡単です:

if (myHashSet.Add(key)) 
{ 
    // item wasn't in the hash set, so process it. 
} 

Addは次のようである "ではないがあれば追加します。"アイテムが追加された場合はtrueを返します。アイテムが既にコレクション内にある場合は、falseを返します。

またはContainsを使用してテストした後、Addを追加して追加することができます。

+3

これは私がこのサイトを愛している理由です:私はHashSetがこの答えの前に存在していたことを認識しませんでした(私は1.0以降.NETでプログラミングされていました。今私は、私は多くの問題を解決するより良い方法を持っています。ありがとう! –

+0

@competent_techこれらを逆コンパイルすると、HashSetが辞書のキーコレクションと同じ実装を使用していることがわかります。 – phoog

0

あなたは潜在的にSystem.Collections.Specialized.StringCollectionを使用することができますが、それは辞書と同じように機能しているかどうかわからず、キーを文字列にキャストする必要があります。

Addメソッドに常に何かを含める必要がある場合は、独自のジェネリックキークラスを作成することができます。例えば、VB.Netを想定:

Public Class KeyDictionary(Of T) 
    Inherits Dictionary(Of T, Boolean) 

    Public Overloads Sub Add(key As T) 
     MyBase.Add(key, False) 
    End Sub 
End Class 

次にインスタンスを宣言し、値を追加する:

Dim cKeys As New KeyDictionary(Of Integer) 

    If Not cKeys.ContainsKey(1) Then 
     cKeys.Add(1) 
    End If 

および、C#で:

public class KeyDictionary<T> : Dictionary<T, bool> 
{ 
    public void Add(T key) 
    { 
     base.Add(key, false); 
    } 
} 

インスタンスを宣言し、追加します値:

 var cKeys = new KeyDictionary<int>(); 

     if (!(cKeys.ContainsKey(1))) 
     { 
      cKeys.Add(1); 
     } 
3

.NET 3.5以降では、 nその目的のためにHashSetを使用してください。必要なメソッドは、AddContainsです。どちらの操作も、O(n)とは対照的に、Listの時間複雑度O(ログn)を持ちます。

+2

実際、 'Add'と' Contains'はO(1)です。ドキュメントを参照してください。 –

+0

@Jim Huh?それを見つけることができないようです。 –

+0

備考:http://msdn.microsoft.com/en-us/library/bb353005.aspx Countが内部配列の容量よりも小さい場合、このメソッドはO(1)オペレーションです.HashSet オブジェクトのサイズを変更する必要がある場合、このメソッドはO(n)オペレーションになります.nはCountです。 –

関連する問題