Получение ключа из значения в коллекции .Net - PullRequest
2 голосов
/ 15 мая 2009

Я использую StringDictionary для хранения пар ключ-значение. Мне нужно использовать ключи и значения взаимозаменяемо, то есть я должен иметь возможность получить ключ от значения, так как в моем случае значения будут отличаться.

Есть ли прямой способ, которым я мог бы это сделать (без зацикливания)? Или, если есть какая-нибудь другая коллекция, которую я мог бы использовать для достижения этой цели?

В настоящее время я зацикливаюсь:

public String GetKeyFromValue(string value)
        {
            foreach (KeyValuePair<string, string> kvp in instance)
            { 
                if (String.Equals(kvp.Value, value))
                    return kvp.Key;
            }

            throw new Exception ("Key not found in FilterControlMapping");
        }

Любая помощь очень ценится. Спасибо.

Ответы [ 4 ]

5 голосов
/ 15 мая 2009

В основном вам нужно использовать два словаря, инкапсулированных в один.

Уже есть реализации здесь и здесь в других вопросах переполнения стека.

2 голосов
/ 15 мая 2009

Я могу думать только о двух словарях.

D1 <Ключ, Значение> D2 <Значение, Ключ>

Вы бы повторили свои данные, хотя. Но вы можете искать и ключи, и значения таким образом.

0 голосов
/ 15 мая 2009

Лучшая идея - использовать Dictionary вместо StringDictionary в качестве устаревшего. Вы можете узнать больше об этом здесь: StringDictionary против словаря <строка, строка> Что касается повторного получения, вы должны идти с linq внутри, он использует циклы, но все же он намного чище ..

0 голосов
/ 15 мая 2009

Это также возможно при использовании словаря:

Dictionary<string, string> sd = new Dictionary<string, string>();
string sKey = sd.Single(kvp => kvp.Value.Equals("A value")).Key;

Обратите внимание, что метод Single будет выдавать, если значение встречается несколько раз Вы можете использовать First или даже FirstOrDefault.

Edit: Как прокомментировал Джон Скит, это все еще происходит. Ссылки, которые он разместил в связанном словаре, обеспечивают решение.

...