2

キーとキーのペアの組み込みデータ構造はありますか? 参照の各「側」が一意で、反対側の 1 つの値に正確に対応する相互参照テーブルを作成しています。

たとえば、色の名前と色コードのセットがある場合、コードまたは名前のいずれかで色を検索したいと考えています。名前ルックアップはカラー コードを返し、コード ルックアップは色の名前を返します。

4

2 に答える 2

4

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);

これがクラスです。GetByFirstandを追加して、のインデクサーのGetBySecondようにアクセスできるようにしました。DictionaryTryGetValue

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];
    }
}
于 2013-09-17T16:33:09.323 に答える