【问题标题】:Bidirectional Map in .NET.NET 中的双向映射
【发布时间】:2010-11-07 16:19:10
【问题描述】:

是否有可用于双向查找的 .NET 数据结构?

问题来了:序列化。我的对象包含一个指向 10 个预定义静态对象之一的字段。写入文件时,我写了一个字符,表示正在引用 10 个对象中的哪一个。此时,我需要一个查找数据结构,它允许我根据被引用的对象获取字符代码。反序列化时,我需要做相反的事情。我可以想到很多其他地方可以使用这种数据结构。

【问题讨论】:

  • 抱歉,我在您接受它以修复错字后编辑了我的答案,但它“不接受”它。奇数。
  • 斯科特,我改变了主意,因为下面的两个答案似乎都足够好。对两者都 +1。
  • @Agnel - 啊,那没问题!

标签: .net data-structures collections containers


【解决方案1】:

我将创建一个包含两个通用Dictionary 对象的数据结构,这些对象相互镜像,其中一个对象的键代表另一个对象的值,反之亦然。这将允许O(1) 双向查找。

【讨论】:

  • 只要所有的键和值都是唯一的,这应该可以工作
  • 在这个特定的问题中,OP 仍然需要创建某种全局注册表来容纳这个数据结构,并且 OP 需要为所有静态对象实现某种方式来向这个全局注册自己数据结构。在那种情况下,不是每个“静态对象”都必须知道它自己的代表角色才能注册自己吗?
  • 这是个好主意,我会小心检查两个 .Contains 之前你做任何一个。添加只是这样,如果有冲突你不会污染任何一个字典。
  • @Scott W.:我主要是在回答如何设计数据结构的一般性问题……不过我会考虑序列化的具体应用。
  • @Doug McClean:确实,这对于健壮的数据结构是必要的。实现这一点会有一些好处,但总的来说,它应该非常简单。
【解决方案2】:

如果只有 10 个很少会改变的情况,使用 Switch 语句的几个方法可能就足够了。

如果您可以控制静态对象,那么它们都可以实现一个返回“序列化代码”字符的新接口:

public interface IStaticObject
{
    char SerializationCode { get; };
}

因此,朝着这个方向前进很容易:someObject.SerializationCode。然后你也可以让你的静态对象都使用一个构造函数,将它们的 SerializationCode 注册到一个具有 Dictionary 的单例实例中。

public class SomeStaticObject : IStaticObject
{
    public void SomeStaticObject()
    {
        StaticObjectRegistrar.Register(this.SerializationCode, this);
    }

    public char SerializationCode
    {
        get
        {
            return ?;
        }
    }
}

反序列化,您只需获取字符并通过该字典运行它以获取静态对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多