gpt4 book ai didi

c# - 双向映射的数据结构

转载 作者:行者123 更新时间:2023-12-02 04:17:46 25 4
gpt4 key购买 nike

现在,在你责骂我之前,我知道有一个非常类似的问题:

Best data structure for two way mapping?

事实上,我正在寻找一种能够完成同样事情的数据结构。具体来说,我有一个字符串应该映射到另一个字符串,并且其他字符串也应该映射到原始字符串。

例如:

".jpg" -> "image/jpeg"
"image/jpeg" -> ".jpg"

链接的问题建议使用某种 HashMap 或 Dictionary<string,string>来实现这一点。

一个自定义数据类型将保存两个字典,每个字典都是一种映射方式。这将提供 O(1),但我发现它根本无法扩展

考虑到我有一个字典,其中包含从 200 个 MIME 类型到关联文件扩展名的所有映射,我需要创建一个类似的字典,内容相同但相反。这很容易出现拼写错误或丢失键,并且有很多重复的代码。

虽然链接的问题旨在寻找 Java 中的解决方案,但我正在寻找 C# 中的解决方案。

是否有.NET数据结构支持对象之间的这种双向映射?

如果没有,如何在不复制代码的情况下完成此任务(如两个字典解决方案中所示)?

最佳答案

为什么具有两个字典的自定义类型不起作用?虽然它会使用双倍的内存,但它允许 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];

关于c# - 双向映射的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com