実際には のレベルが 2 つ以上あるようですDictionary
。このタイプの構文を使用して可変数の辞書をサポートすることはできないため:
Dictionary<string, Dictionary<string, ... >...> nestedDictionary;
2より大きい数であるとしか考えられません。3つだとしましょう。構築するデータ構造には、効率的に実行したい用途と操作があります。
次のような呼び出しが必要であると仮定します。
var dictionary = new ThreeLevelDictionary();
dictionary.Add(string1, string2, string3, value);
var value = dictionary[string1, string2, string3];
dictionary.Remove(string1, string2, string3);
そして(質問にとって重要)あなたが説明している逆引き:
var strings = dictionary.FindKeys(value);
これらが実行する必要があり、迅速に実行する必要がある操作である場合、使用できる 1 つのデータ構造はキーDictionary
付きです。Tuple
public class ThreeLevelDictionary<TValue> : Dictionary<Tuple<string, string, string>, TValue>
{
public void Add(string s1, string s2, string s3, TValue value)
{
Add(Tuple.Create(s1, s2, s3), value);
}
public TValue this[string s1, string s2, string s3]
{
get { return this[Tuple.Create(s1, s2, s3)]; }
set { value = this[Tuple.Create(s1, s2, s3)]; }
}
public void Remove(string s1, string s2, string s3)
{
Remove(Tuple.Create(s1, s2, s3);
}
public IEnumerable<string> FindKeys(TValue value)
{
foreach (var key in Keys)
{
if (EqualityComparer<TValue>.Default.Equals(this[key], value))
return new string[] { key.Item1, key.Item2, key.Item3 };
}
throw new InvalidOperationException("missing value");
}
}
これで、パフォーマンスがボトルネックであることが示された場合に、別のハッシュテーブルを使用して逆引き参照ハッシュテーブルを作成する準備が整いました。 Dictionary
前の好きな操作が実行したいものではない場合、このデータ構造はニーズを満たさない可能性があります。いずれにせよ、データ構造で何をしたいのかを要約したインターフェースを最初に記述すれば、他の選択肢があるかどうかを簡単に確認できます。