【问题标题】:Getting key from value in .Net collection从 .Net 集合中的值获取键
【发布时间】:2010-10-26 09:52:30
【问题描述】:

我正在使用 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");
        }

非常感谢任何帮助。 谢谢。

【问题讨论】:

标签: collections .net-2.0 dictionary


【解决方案1】:

你基本上需要使用两个字典封装成一个。

在其他 Stack Overflow 问题中已经有实现 herehere

【讨论】:

  • 这意味着内存翻倍,不是吗?
  • 记忆究竟是什么?您仍然只有一次实际的 objects (假设我们正在谈论引用类型),因为每个集合都只有对实际值的引用。是的,簿记等所需的空间会增加一倍,但这是您为能够双向查找所付出的代价。
【解决方案2】:

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

D1 D2

你会重复你的数据。但是您可以通过这种方式同时搜索键和值。

【讨论】:

    【解决方案3】:

    最好的办法是使用 Dictionary 而不是 StringDictionary 作为其过时的.. 您可以在此处了解更多信息: StringDictionary vs Dictionary<string, string> 关于检索,您应该在内部使用 linq,它使用循环,但仍然是更清洁的方式..

    【讨论】:

    • 您好,感谢您提供的信息。我实际上已经从 Dictionary 迁移到 StringDictionary。是时候恢复了:)
    【解决方案4】:

    这也可以使用字典:

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

    请注意,如果值多次出现,Single 方法将抛出异常。您可以使用 First 甚至 FirstOrDefault。

    编辑: 正如 Jon Skeet 评论的那样,这仍在循环中。他发布到链接字典的链接提供了解决方案。

    【讨论】:

    • 这是有效地循环,即复杂性是 O(n) 而不是理想的 O(1)。
    • 我可以在 2.0 中使用 => 运算符吗?
    • 不,你不能使用 lambda 表达式。请参阅stackoverflow.com/questions/556425/predicate-delegates-in-c,了解如何在 2.0 中实现相同功能,但请注意 Jon Skeet 的评论。这仍然会循环!
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多