【问题标题】:C# Unique one-to-one mapping dictionary [duplicate]C#唯一的一对一映射字典[重复]
【发布时间】:2015-12-27 04:31:32
【问题描述】:

我正在编写一小段代码来将类序列化为二进制,可以将其反序列化为对象,而无需知道接收端的类型。类型在程序集中定义,但您不必在方法调用中提供它(例如Deserialize<MyType>())。我想创建某种字典,允许我从int 中获取Type,并从Type 中获取相应的int。 .Net 中是否有执行此操作的对象?

我目前有一个包含两个private 字典和一些方法来处理和验证同步字典的添加和删除的类。问题是,这就是我要避免的(重复数据)。

编辑:“潜在重复”中提出的解决方案基本上是在做我已经在做的事情。我在问是否有一个特殊的字典类已经这样做了,这将允许一对一的关系而不复制每个键和值。

【问题讨论】:

    标签: c# .net dictionary serialization one-to-one


    【解决方案1】:

    使用两个私有字典(一个 Dictionary<int,type> 另一个 Dictionary<type,int>)创建您自己的课程。创建两个方法IntToTypeTypeToInt,它们将从各自的字典中获取数据。然后添加一个方法Add(int i, Type t),它将添加到两个字典中。由于这是添加到它的唯一方法(因为它们是私有的),所以它们不可能不同步。

    【讨论】:

    • 我在问题中指定这已经是我所拥有的了。我的问题是:这是这样做的方法,还是有一个 .Net 对象可以在不复制数据的情况下做到这一点。
    • 除非你有数以百万计的课程,否则我什至不会担心。 inttype 并不是很多数据。 inttype 乘以 100 然后再乘以 2(对于两个字典)仍然不是很多数据。
    • 我真正关心的不是数据的大小,我确实觉得它不应该大两倍,但我觉得这是一个引入错误的完美地方。如果没有为此目的定义对象,我将简单地花更多时间来创建我自己的,正确检查每个插入和删除等等......
    • @PhilippeParé:几乎没有。您有两个方法:AddRemove,并确保它们是仅有的两个可以更改基础字典的公共方法。不会让我觉得特别容易出问题。
    • 我想答案必须是:在.Net 中没有这样做的类......我知道我可以使用两个字典,我知道如何添加和删除。想象一下我有内存限制,在这种情况下你会怎么做?
    【解决方案2】:

    如果您想快速访问以从 int 获取 Type 或从 int form Type 获取,您必须以某种方式复制数据。但是,如果在您的情况下访问时间并不重要,您可以只存储一个字典并编写类似的方法来获取指定值的键

    private Dictionary<int, Type> types;
    
    public int GetIntForType(Type t)
    {
        return types.FirstOrDefault(x => x.Value == t).Key;
    }
    

    【讨论】:

    • 根据使用情况,这可能足够有效。如果从inttype 的查找是最常见的,从typeint 的查找是很少见的(如果相反的情况是正确的,只需使用Dictionary&lt;type,int&gt; 而不是&lt;int,type&gt;)和数字的项目很小。
    猜你喜欢
    • 2014-02-17
    • 2013-06-17
    • 2019-08-27
    • 1970-01-01
    • 2019-01-17
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多