キーとキーのペアの組み込みデータ構造はありますか? 参照の各「側」が一意で、反対側の 1 つの値に正確に対応する相互参照テーブルを作成しています。
たとえば、色の名前と色コードのセットがある場合、コードまたは名前のいずれかで色を検索したいと考えています。名前ルックアップはカラー コードを返し、コード ルックアップは色の名前を返します。
キーとキーのペアの組み込みデータ構造はありますか? 参照の各「側」が一意で、反対側の 1 つの値に正確に対応する相互参照テーブルを作成しています。
たとえば、色の名前と色コードのセットがある場合、コードまたは名前のいずれかで色を検索したいと考えています。名前ルックアップはカラー コードを返し、コード ルックアップは色の名前を返します。
Jon Skeet のBiDictionary
クラスはあなたが探しているものだと思います。次のように使用します。
BiDictionary<string, string> colors = new BiDictionary<string, string>();
colors.Add("Green", "00FF00");
colors.Add("Red", "FF0000");
colors.Add("White", "FFFFFF");
string code = colors.GetByFirst("Red");
string name = colors.GetBySecond("FF0000");
Console.WriteLine(code);
Console.WriteLine(name);
これがクラスです。GetByFirst
andを追加して、のインデクサーのGetBySecond
ようにアクセスできるようにしました。Dictionary
TryGetValue
using System;
using System.Collections.Generic;
class BiDictionary<TFirst, TSecond>
{
IDictionary<TFirst, TSecond> firstToSecond = new Dictionary<TFirst, TSecond>();
IDictionary<TSecond, TFirst> secondToFirst = new Dictionary<TSecond, TFirst>();
public void Add(TFirst first, TSecond second)
{
if (firstToSecond.ContainsKey(first) ||
secondToFirst.ContainsKey(second))
{
throw new ArgumentException("Duplicate first or second");
}
firstToSecond.Add(first, second);
secondToFirst.Add(second, first);
}
public bool TryGetByFirst(TFirst first, out TSecond second)
{
return firstToSecond.TryGetValue(first, out second);
}
public TSecond GetByFirst(TFirst first)
{
return firstToSecond[first];
}
public bool TryGetBySecond(TSecond second, out TFirst first)
{
return secondToFirst.TryGetValue(second, out first);
}
public TFirst GetBySecond(TSecond second)
{
return secondToFirst[second];
}
}