键-键对字典通过键两端访问的方式?
键-键对字典通过键两端访问的方式?
我正在寻找一个通用的、双向的1对1字典类(C#中的2),即一个“BiDictionaryOneToOne
在这个问题的答案中有一个BiDictionary,但它不是用于唯一元素(也没有实现RemoveByFirst(T t)或RemoveBySecond(S s))。
谢谢!
这篇文章介绍了一个双向字典的实现,该字典可以通过键访问值,也可以通过值访问键。这个问题的出现原因是为了提供一个更完整的双向字典实现,以及支持各种接口的访问方式。下面是问题的解决方法和实现代码。
这个双向字典的实现具有以下特点:
- 支持原始Dictionary的几乎所有接口,包括IDictionary、IReadOnlyDictionary、ICollection等。
- 使用SerializableAttribute进行序列化。
- 使用DebuggerDisplayAttribute和DebuggerTypeProxyAttribute进行调试查看。
- 反向字典作为IDictionary属性提供,并且也实现了上面提到的所有接口。对任一字典的操作都会同时修改两个字典。
下面是代码的用法示例:
var dic = new BiDictionary(); dic.Add(1, "1"); dic[2] = "2"; dic.Reverse.Add("3", 3); dic.Reverse["4"] = 4; dic.Clear();
这个双向字典的代码可以在GitHub上找到,具体链接如下:
[https://github.com/Athari/Alba.Framework/blob/master/Alba.Framework/Collections/Collections/BiDictionary(TFirst%2CTSecond).cs](https://github.com/Athari/Alba.Framework/blob/master/Alba.Framework/Collections/Collections/BiDictionary(TFirst%2CTSecond).cs)
不幸的是,你提供的GitHub链接无效。在代码片段中的item.Reverse行会引起编译错误,这可能是因为代码中缺少了KeyValuePairExts类的定义。如果你需要支持键的相等比较,这个双向字典实现可能并不适用。
,这个双向字典的实现提供了一种通过键和值两个方向进行访问的方式,可以方便地进行双向查找和修改。它支持多种接口,并且具有序列化和调试查看的功能。但需要注意的是,它可能不适用于需要键的相等比较的场景。
问题:如何创建一个具有双向通过键访问的键-键值对字典?
原因:在Stack Overflow的一个问题中,有人询问如何实现一个具有双向通过键访问的键-键值对字典。这种字典允许通过键快速查找值,同时也可以通过值快速查找键。目前的实现只提供了通过键查找值的功能,因此需要找到一种解决方法来实现双向访问。
解决方法:可以在现有的实现中添加RemoveByFirst和RemoveBySecond方法来实现双向访问。此外,还可以实现额外的接口来提供更多的功能。
以下是具体的实现代码示例:
class TwoWayDict(dict): def __setitem__(self, key, value): # Check if the key or value already exist in the dictionary if key in self and self[key] != value: # Remove the existing key-value pair with the same key self.pop(key) if value in self and self[value] != key: # Remove the existing key-value pair with the same value del self[self[value]] # Add the new key-value pair dict.__setitem__(self, key, value) dict.__setitem__(self, value, key) def remove_by_first(self, key): # Remove the key-value pair by the first key if key in self: value = self[key] del self[key] del self[value] def remove_by_second(self, value): # Remove the key-value pair by the second key if value in self: key = self[value] del self[value] del self[key]
上述代码定义了一个名为TwoWayDict的类,该类继承自内置的dict类。在该类中,重写了__setitem__方法来实现双向访问。当向字典中添加新的键-值对时,会先检查是否存在与新键或新值相同的键-值对,如果存在,则会先将其删除,然后再添加新的键-值对。同时,也实现了remove_by_first和remove_by_second方法来通过第一个键或第二个键删除键-值对。
这样,通过使用该TwoWayDict类,就可以实现双向通过键访问的键-键值对字典了。
从上面的内容中可以看出,问题的出现是因为需要一个具有双向访问的键值对字典。传统的字典只能通过键来查找值,无法通过值来查找键,而这个需求需要能够通过键或者值来查找对应的另一方。为了解决这个问题,代码提供了一个名为BiDictionaryOneToOne的类,这个类使用两个字典实现了双向访问。其中一个字典用于通过第一个键找到第二个键,另一个字典用于通过第二个键找到第一个键。这样就可以根据需要通过任意一方来查找另一方。此外,代码还提供了一些其他的方法,如添加、删除和清空等,以及一些用于判断是否存在、尝试添加和尝试删除的方法。整个代码实现了键值对字典的基本功能,并且提供了一些额外的功能,比如支持集合初始化、序列化和异常处理等。整体来说,这个类提供了一种解决双向访问的键值对字典需求的方法。