C#ディクショナリ:値ごとに複数のキー

Source c# .net map

単一の値で複数のキーを取得する方法を探しています。はい、私はすでに検索機能を使用しましたが、ほとんどの答えは反対方向(キーごとに複数の)に対するものですが、反対の方向が必要です。

この背後にある理由は、「メイン」IDごとに複数のItem-ID(ボット用)を保持したいので、それらの複数のIDを1つの値にスローするのは遅すぎて変更できません(1つの値を探す=>ループトラフ)すべてのメインIDと各値を取得し、そのIDが存在するかどうかを確認します)。


Key 1 => Value
Key 2 => Value
Key 3 => Value
Key 4 => Value
Key 5 => Value 2

値を探すと、次のようになります。5ではなくキー1〜4

だから私はそれをもっと簡単にする方法を探しています-私が上で言ったように。

それが可能かどうか、そしてそれをどのように行うかを誰かが知っていますか?
前もって感謝します。
推奨答え
逆に辞書を作成し、値をアイテムのリストにします。

たとえば、Valueが文字列で、Key 1-4がintの場合、辞書は次のようになります。
var theDictionary = new Dictionary<string, List<int>>();
ValuetheDictionary["Value"]を取得すると、1、2、3、4を含むintのリストが返されます。

編集-追加された例:
var theDictionary = new Dictionary<string, List<string>>
    {
        {"Value", new List<string> {"Key 1", "Key 2", "Key 3", "Key 4", "Key 5",}},
        {"Value2", new List<string> {"Key 5", "Key 2"}}
    };

var oneToFour = theDictionary["Value"];
その他答え #1
編集:
編集内容を見ると、このDictionaryを逆方向に設計したように見えます...キーは、一致するキーの値ではなく、一致する値用である必要があります。

外部キーを内部キーにマップするディクショナリを作成してから、内部キーを使用して2番目のディクショナリにインデックスを付けるなどの操作を行うことができます。

例:
var outer = new Dictionary<int, Guid> {
  { 1, GuidA },
  { 2, GuidA },
  { 3, GuidA },
  { 4, GuidA },
  { 5, GuidB }
};
var inner = new Dictionary<Guid, Value> {
  { GuidA, Value1 },
  { GuidB, Value2 }
};
value = outer[inner[key]]としてアクセスします。
その他答え #2
あなたは自分の問題を考えすぎているかもしれません。ルックアップ操作に役立つためには、キーが一意である必要があります。値は一意である必要はありません。複数のキーが問題を引き起こすことなく同じ値を指すことができます。
その他答え #3
1)Servyは絶対に正しいです。キー以外のものを検索している場合...そして対応する値以外のものを取得しようとしている場合...何かが間違いなく間違っています。すべてが同じであれば、おそらく辞書は必要ありません。

2)あなたが言っていることに基づいて、おそらくより良いコレクションタイプはリストかもしれません。具体的には、名前と値のペアのリスト。

例:
List<string> NVList = new List<string>();
NVList.Add("color=blue");
...

3).Netには、理想的な特殊な「NameValueCollection」クラスがあることに注意してください。
  • http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx
  • その他答え #4
    最初の辞書(キーを値にマップする)が既にあると仮定すると、Linqを使用して、手動で逆辞書を作成しなくても、逆辞書に変換できます。
    var newDict = initialDict.Select(x=>x.Value).Distinct().ToDictionary(x=>x, x=> initialDict.Where(kvp=>kvp.Value == x).Select(kvp=>kvp.Key));
    

    元の辞書から個別のoriginalValuesを選択し、それらをnewKeysとして使用します。 newValuesは、各originalKeys / originalValueにマップされたnewKeyのセットです。

    例:https://dotnetfiddle.net/dhwUSC

    の初期辞書が与えられた
    var initialDict = new Dictionary<int, string>{
            {1, "Value"},
            {2, "Value"},
            {3, "Value"},
            {4, "Value"},
            {5, "Value2"}
        };
    

    上記の関数は
    Value: {1, 2, 3, 4}
    Value2: {5}
    

    関連記事

    css3のみを使用して新しく作成された要素をフェードインすることは可能ですか?
    Django管理パネルにすべての外部キー関連オブジェクトを一覧表示するにはどうすればよいですか?
    C#形式でスクロールバーを追加する方法
    C#で不変のリストタイプをシリアル化/逆シリアル化する方法
    asp.netのボタンをクリックしたときに動的にコントロールを追加するにはどうすればよいですか?