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

时间:2010-09-27 18:16:56

标签: .net dictionary types

是否有任何.NET类型代表一组键值对,其中每个键只与单个值配对(如常规Dictionary),但每个值只会与一把钥匙?我一直认为这是一个“可逆的”字典,因为你可以将键与值交换而不会发生任何冲突。编写这样的类并不难,并为给定值添加类似“TryGetKey”的方法。但是,我想检查这样的事情是否已经存在于某个地方,可能是我想不到的另一个名字。

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

2 个答案:

答案 0 :(得分:3)

我不相信框架中有一个类可以直接执行此操作。

  

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

您的两个问题的答案实际上取决于您将如何访问您的数据。如果您需要基于密钥和值的快速,恒定的时间访问,您很可能想要自己创建集合。

但这可以非常非常轻松地完成。只需在类中包含两个Dictionary实例,当你添加一个新元素时,添加到两个 - 一个带键/值,一个带值/键。您的查找例程可以从适当的集合中拉出,并且它将保持在O(1)附近以便访问时间。

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

答案 1 :(得分:1)

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