Получение нескольких ключей указанного значения универсального словаря? - PullRequest
114 голосов
/ 01 ноября 2008

Получить значение ключа из универсального словаря .NET легко:

Dictionary<int, string> greek = new Dictionary<int, string>();
greek.Add(1, "Alpha");
greek.Add(2, "Beta");
string secondGreek = greek[2];  // Beta

Но попытка получить ключи с заданным значением не так проста, потому что может быть несколько ключей:

int[] betaKeys = greek.WhatDoIPutHere("Beta");  // expecting single 2

Ответы [ 14 ]

1 голос
/ 08 августа 2012
Dictionary<string, string> dic = new Dictionary<string, string>();
dic["A"] = "Ahmed";
dic["B"] = "Boys";

foreach (string mk in dic.Keys)
{
    if(dic[mk] == "Ahmed")
    {
        Console.WriteLine("The key that contains \"Ahmed\" is " + mk);
    }
}
1 голос
/ 01 ноября 2008

Не можете ли вы создать подкласс словаря с такой функциональностью?


    public class MyDict &lt TKey, TValue &gt : Dictionary &lt TKey, TValue &gt
    {
        private Dictionary &lt TValue, TKey &gt _keys;

        public TValue this[TKey key]
        {
            get
            {
                return base[key];
            }
            set 
            { 
                base[key] = value;
                _keys[value] = key;
            }
        }

        public MyDict()
        {
            _keys = new Dictionary &lt TValue, TKey &gt();
        }

        public TKey GetKeyFromValue(TValue value)
        {
            return _keys[value];
        }
    }

РЕДАКТИРОВАТЬ: Извините, с первого раза неправильно понял код.

0 голосов
/ 07 июня 2018

Тогда решение дилетанта

Для создания такого словаря можно написать функцию, аналогичную приведенной ниже:

    public Dictionary<TValue, TKey> Invert(Dictionary<TKey, TValue> dict) {
    Dictionary<TValue, TKey> ret = new Dictionary<TValue, TKey>();
    foreach (var kvp in dict) {ret[kvp.value] = kvp.key;} return ret; }
0 голосов
/ 04 ноября 2014

Как поворот принятого ответа (https://stackoverflow.com/a/255638/986160) при условии, что ключи будут связаны со значениями сигнатуры в словаре. Похоже на (https://stackoverflow.com/a/255630/986160), но немного более элегантно. Новинка в что потребительский класс может использоваться как альтернатива перечисления (но также и для строк) и что в словаре реализован IEnumerable.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace MyApp.Dictionaries
{

    class BiDictionary<TFirst, TSecond> : IEnumerable
    {
        IDictionary<TFirst, TSecond> firstToSecond = new Dictionary<TFirst, TSecond>();
        IDictionary<TSecond, TFirst> secondToFirst = new Dictionary<TSecond, TFirst>();

        public void Add(TFirst first, TSecond second)
        {
            firstToSecond.Add(first, second);
            secondToFirst.Add(second, first);
        }

        public TSecond this[TFirst first]
        {
            get { return GetByFirst(first); }
        }

        public TFirst this[TSecond second]
        {
            get { return GetBySecond(second); }
        }

        public TSecond GetByFirst(TFirst first)
        {
            return firstToSecond[first];
        }

        public TFirst GetBySecond(TSecond second)
        {
            return secondToFirst[second];
        }

        public IEnumerator GetEnumerator()
        {
            return GetFirstEnumerator();
        }

        public IEnumerator GetFirstEnumerator()
        {
            return firstToSecond.GetEnumerator();
        }

        public IEnumerator GetSecondEnumerator()
        {
            return secondToFirst.GetEnumerator();
        }
    }
}

И как класс потребления вы можете иметь

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyApp.Dictionaries
{
    class Greek
    {

        public static readonly string Alpha = "Alpha";
        public static readonly string Beta = "Beta";
        public static readonly string Gamma = "Gamma";
        public static readonly string Delta = "Delta";


        private static readonly BiDictionary<int, string> Dictionary = new BiDictionary<int, string>();


        static Greek() {
            Dictionary.Add(1, Alpha);
            Dictionary.Add(2, Beta);
            Dictionary.Add(3, Gamma);
            Dictionary.Add(4, Delta);
        }

        public static string getById(int id){
            return Dictionary.GetByFirst(id);
        }

        public static int getByValue(string value)
        {
            return Dictionary.GetBySecond(value);
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...