为什么使用两个字典的自定义类型不起作用?虽然它会使用两倍的内存,但它允许O(1)查找,并且应该按照您的要求工作。
然而,当涉及到通用参数,它可以变得有点毛。如果指定了相同的类型,这不是问题,但是如果指定了不同的类型,则索引器会中断,因为只能以单向方式获取值。如果你重载索引,有两个,即:
public K this[T value]
public T this[K value]
这将打破,如果你有相同的参数,因为它不能够解决。在这种情况下,我建议有两个不同的类别:
public class TwoWayDictionary<T>
{
private Dictionary<T, T> _first;
private Dictionary<T, T> _second;
public TwoWayDictionary()
{
_first = new Dictionary<T, T>();
_second = new Dictionary<T, T>();
}
public void Add(T first, T second)
{
_first.Add(first, second);
_second.Add(second, first);
}
public T this[T value]
{
get
{
if(_first.ContainsKey(value))
{
return _first[value];
}
if(_second.ContainsKey(value))
{
return _second[value];
}
throw new ArgumentException(nameof(value));
}
}
}
和
public class TwoWayDictionary<T, K>
{
private readonly Dictionary<T, K> _first;
private readonly Dictionary<K, T> _second;
public TwoWayDictionary()
{
_first = new Dictionary<T, K>();
_second = new Dictionary<K, T>();
}
public void Add(T first, K second)
{
_first.Add(first, second);
_second.Add(second, first);
}
public K this[T value]
{
get
{
if (_first.ContainsKey(value))
{
return _first[value];
}
throw new ArgumentException(nameof(value));
}
}
public T this[K value]
{
get
{
if (_second.ContainsKey(value))
{
return _second[value];
}
throw new ArgumentException(nameof(value));
}
}
}
这将允许你使用它就像在评论中提到:
var dict = new TwoWayDictionary<string>();
dict.Add(".jpg", "image/jpg");
var mime = dict[".jpg"];
var ext = dict["image/jpg"];
,并指定2如果你想不同的类型:
var dict = new TwoWayDictionary<string, int>();
dict.Add(".jpg", 100);
var number = dict[".jpg"];
var ext = dict[100];
从理论上讲,你需要'dictionary.Add(“.jpg”,“image/jpg”)'',并且可以将它用作var mime = dictionary [“。jpg”]''var var ext = dictionary [ “图像/ JPG”]'? –
@DaveZych正是! –
似乎有点毫无意义,因为你仍然可以明确映射这些关系已经.. –