6

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

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

4

3 に答える 3

16

私は提案しHashSet<T>ます。キーがすでに使用されていることだけを知る必要がある場合は、キーを入力するだけで済みます。

それも本当に簡単です:

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

Add「そこにない場合は追加する」のようなものです。trueアイテムが追加された場合に戻ります。falseアイテムがすでにコレクションにあった場合に返されます。

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

于 2012-12-30T02:34:34.037 に答える
3

.NET 3.5以降ではHashSet、その目的でを使用できます。必要なメソッドはとと呼ばれAddますContains。両方の操作は、aのO(n)とは対照的に、時間計算量O(log n持ちます。List

于 2012-12-30T02:33:06.880 に答える
0

System.Collections.Specialized.StringCollectionを使用できる可能性がありますが、Dictionaryほどパフォーマンスが高く、文字列にキーをキャストする必要があるかどうかはわかりません。

Addメソッドに常に何かを含めるという要件が煩わしい場合は、独自の汎用キークラスを作成できます。これは、基礎となる.Net実装が見つかったときにそれをより適切に適合させることができます。たとえば、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);
        }
于 2012-12-30T02:30:53.497 に答える