3

辞書に一意の値を強制することは可能ですか? 次の例を参照してください。

Dictionary<string, string> types = new Dictionary<string, string>()
{
        {"1", "one"},
        {"2", "two"},
        {"3", "three"}
};

次の行を実行しようとした場合、エラーが発生するはずです。

types.Add("4","one");

これは、ディクショナリが動作するように構築されている方法ではないことを知っています。正しい答えは、異なる/カスタムのデータ構造を使用することです。

4

4 に答える 4

12

2 つのデータ構造を保持します。通常の辞書とHashSet<string>値の a。アイテムを追加する場合は、最初に値がハッシュ セットにあるかどうかを確認します。そうでない場合は、辞書とセットの両方に安全に追加できることがわかります。(また、削除時に両方のコレクションからアイテムを削除するようにしてください。)

これが十分な場所で行われる場合はIDictionary<K,V>、通常DictionaryHashSet内部の両方を使用する独自の実装を作成する価値があるかもしれません。これにより、使用時に多くの作業を行う必要がなくなります。この特定の構造がほんの数か所でしか使用されていない場合、そのようなクラスを作成するのに投資する価値はないかもしれません。

于 2013-09-16T16:06:45.710 に答える
6

おそらく、対応するメソッドを実装IDictionaryして内部的に呼び出すだけです。Dictionary<TKey,TValue>また、 が必要ですHashSet<TValue>。次に、 Add メソッドで、最初にhashset.Contains(value). その場合は、例外をスローします。

一方で、この動作が本当に必要ですか? を使用するとどうなりますかHashSet<Tuple<string,string>>。次に、重複は無視されます。それとも、例外をスローするデータ構造が本当に必要ですか? そうでない場合は、それが私が行くものです。

編集:良い点@Alexei Levenkov。異なるキーで同じ値を持つ場合、HashSet アプローチでは、最初に求めたものは得られません。これは、同じキーと値のペアが必要な場合にのみ適用されます。

于 2013-09-16T16:00:40.110 に答える