3

辞書 obj を宣言しました。

Dictionary<string, string> aDict = new Dictionary<string, string>(); 
        aDict .Add("IP", "Host"); 

思い出したように、

の式はaDict[IP]、値 (ホスト) を返すことができます。

今、反対方向に行くと。

Value からキーを取得する方法は? aDict[Host]?

Dictionary は C# の一方通行であり、 Key から Value へのみ実行されますか? ありがとう。

4

4 に答える 4

19

辞書はこのようには機能しませんし、そうするつもりもありません。次のことをどのように解決しますか。

key = "1", value = "x",
key = "2", value = "x"

あなたはこれを行うことができます:

var keys = dict.Where(kvp => kvp.Value == someValue).Select(kvp => kvp.Key);
foreach(var key in keys) {
    Console.WriteLine(key);
}

ただし、キーと値の間を行き来する必要がある場合は、問題を双方向マップにカプセル化することを検討する必要があります。これは、ニーズに合わせて調整できる非常に単純な実装です。

class TwoWayDictionary<TLeft, TRight> {
    IDictionary<TLeft, TRight> leftToRight = new Dictionary<TLeft, TRight>();
    IDictionary<TRight, TLeft> rightToLeft = new Dictionary<TRight, TLeft>();

    public void Add(TLeft left, TRight right) {
        if (leftToRight.ContainsKey(left)) {
            throw new InvalidOperationException("key left is duplicate");
        }
        if (rightToLeft.ContainsKey(right)) {
            throw new InvalidOperationException("key right is duplicate");
        }
        leftToRight.Add(left, right);
        rightToLeft.Add(right, left);
    }

    public bool TryGetRightByLeft(TLeft left, out TRight right) {
        return leftToRight.TryGetValue(left, out right);
    }

    public bool TryGetLeftByRight(out TLeft left, TRight right) {
        return rightToLeft.TryGetValue(right, out left);
    }
}

これは、キーが複製されないことを前提としていることに注意してください。

今、あなたは言うことができます:

TwoWayDictionary<string, string> dict = new TwoWayDictionary<string, string>();
dict.Add("127.0.0.1", "localhost");

string host;
dict.TryGetRightByLeft("127.0.0.1", out host);
// host is "localhost"

string ip;
dict.TryGetLeftByRight("localhost", out ip);
// ip is "127.0.0.1"
于 2010-01-06T03:39:13.963 に答える
3

ディクショナリは一方向のルックアップです。必要に応じて、ディクショナリ内のすべてのエントリをループして値 "Host" を探すことができます。それを頻繁に行うことが予想される場合は、2 つの辞書を使用して両方を同期させたいと思うかもしれません。

于 2010-01-06T03:37:05.700 に答える
1

一方通行です。値は一意であると想定されていないため、ディクショナリ全体を列挙する場合を除き、キーを値で検索することはできません。

 foreach(string s in Dict.Keys)
 {
   if(Dict[s] == TheValue)
       ;//we found it!
 }
于 2010-01-06T03:37:17.213 に答える
1

はい、辞書は基本的に一方通行です。たとえば、多くのキーが値「Host」を持つ可能性があるため、単純な逆引きはありません。

ただし、辞書を反復処理して、どのキーが目的の値にマップされているかを確認できます。

foreach (var entry in dict)
{
  if (entry.Value == desiredValue)
    found.Add(entry.Key);
}

明らかに、これは大きな辞書には効率的ではありません。

于 2010-01-06T03:37:38.867 に答える