代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

.NET“可逆”字典,其中键和值可交换

  •  4
  • Sarah Vessels  · 技术社区  · 15 年前

    是否有任何.NET类型可以表示一组键值对,其中每个键值只与一个值(如正则的 Dictionary ,但每个值也只能与一个键配对?我一直认为这是一个“可逆”的字典,因为您可以用值交换键,而不会发生任何冲突。编写这样的类并为给定的值添加类似“TryGetKey”的方法并不难。然而,我想检查这样的东西是否已经存在于某个地方,也许是以我没有想到的另一个名字。

    同时,考虑到优雅的回答 this question ,当我可以轻松地使用LINQ将任何字典转换为其值键等效项时,是否值得创建一个类来表示此可逆字典?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Reed Copsey    15 年前

    我不相信框架中有一个类可以直接这样做。

    另外,考虑到这个问题优雅的答案,当我可以很容易地使用LINQ将任何字典转换为其值键等价物时,是否值得创建一个类来表示这个可逆字典?

    这两个问题的答案实际上取决于您将如何访问数据。如果您需要基于密钥和值的快速、持续的时间访问,那么您很可能会希望创建自己的集合。

    不过,这可以非常、非常容易地做到。只需在类中包装两个字典实例,当您添加一个新元素时,请同时添加到这两个元素中-一个具有键/值,另一个具有值/键。您的查找例程可以从适当的集合中提取,并且在访问时它将保持在O(1)附近。

    但是,如果更关心内存问题,您可以只使用一个集合,并使用LINQ来解析它。这将使“反向”查找速度变慢,因为每次都需要重新解析。

        2
  •  1
  •   Jim Mischel    15 年前

    如果您真的需要这样的数据结构,那么您可能不希望每次执行查找时都转换它。也就是说,如果你有一个正常的 Dictionary<string,int> ,每次按值进行查找时,都必须进行转换。你可以对它进行优化,这样你只需要在字典改变的情况下进行转换(即一个项目被添加、删除或更改),但它仍然是一个相当高的代价。