Collections 从.Net集合中的值获取密钥

Collections 从.Net集合中的值获取密钥,collections,.net-2.0,dictionary,Collections,.net 2.0,Dictionary,我正在使用StringDictionary来存储键值对。我需要交替使用键和值,即我应该能够从值中获取键,因为在我的情况下,值是不同的 有没有一种直接的方法可以做到这一点(没有循环)?或者,如果有任何其他收集我可以用来实现这一点 目前我正在循环: public String GetKeyFromValue(string value) { foreach (KeyValuePair<string, string> kvp in instance)

我正在使用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");
        }
公共字符串GetKeyFromValue(字符串值)
{
foreach(实例中的KeyValuePair kvp)
{ 
if(String.Equals(kvp.Value,Value))
返回kvp.Key;
}
抛出新异常(“在FilterControlMapping中找不到键”);
}
非常感谢您的帮助。
谢谢。

我能想到的唯一办法就是两本字典

D1<键,值> D2<值,键>


不过,您可能会重复您的数据。但您可以通过这种方式搜索键和值。

这也可以使用字典:

Dictionary<string, string> sd = new Dictionary<string, string>();
string sKey = sd.Single(kvp => kvp.Value.Equals("A value")).Key;
Dictionary sd=newdictionary();
字符串sKey=sd.Single(kvp=>kvp.Value.Equals(“A值”)).Key;
请注意,如果该值出现多次,则单个方法将抛出。您可以使用First甚至FirstOrDefault

编辑:
正如Jon Skeet所评论的,这仍然是一个循环。他发布到链接词典的链接提供了解决方案。

基本上需要使用两个封装成一个的词典


已经有了实现和其他堆栈溢出问题。

最好的办法是使用Dictionary而不是StringDictionary作为其obselete。。 您可以在此处了解更多信息:
关于检索,您应该在内部使用linq,它使用循环,但仍然更干净。

这是有效的循环,即复杂性是O(n),而不是理想的O(1)。我可以在2.0中使用=>运算符吗?不,不能使用lambda表达式。请注意Jon Skeet的评论,看看如何在2.0中实现相同的功能。这仍然会循环!那就意味着记忆加倍了,不是吗?记忆到底是什么?您仍然只有一次实际的对象(假设我们讨论的是引用类型),因为每个集合都只有对实际值的引用。是的,簿记等所需的空间将增加一倍,但这是您为能够双向查找而付出的代价。嘿,谢谢您提供的信息。我实际上已经从一本字典迁移到另一本字典。恢复时间:)已更改的标记,因为它不是asp.net特定的,可能与的重复