【问题标题】:Collection with two keys [closed]带有两个键的集合[关闭]
【发布时间】:2010-01-25 14:23:11
【问题描述】:

在我为这个问题制定的解决方案中 => General type conversion without risking Exceptions(参见问题底部的编辑),我需要缓存一种用于在两种类型之间进行转换的方法。

所以,给定 Type1 和 Type2,我需要检索一个方法。

在这个问题的答案中 => What is the best C# collection with two keys and an object? 建议使用字典。这与我正在做的类似。

但我不喜欢它。它与集合所代表的内容不合逻辑。还要检索我必须做​​的值:

        if ( !_Types.ContainsKey ( s.GetType () ) )
        {
            type1Cache = new Dictionary<Type, ConversionCache> ();

            _Types.Add ( s.GetType (), type1Cache );
        }
        else
        {
            type1Cache = _Types[s.GetType ()];
        }

        if ( !type1Cache.ContainsKey ( value.GetType () ) )
        {
            // We havent converted this type before, so create a new conversion
            type2Cache = new ConversionCache ( s.GetType (), value.GetType () );

            // Add to the cache
            type1Cache.Add ( value.GetType (), type2Cache );
        }
        else
        {
            type2Cache = type1Cache[value.GetType ()];
        }

有点啰嗦。

我只是想做一些类似的事情

        if ( !_Types.ContainsKey ( s.GetType (), value.GetType() ) )
        {
            cache = new ConversionCache ( s.GetType (), value.GetType () );

            _Types.Add ( s.GetType (), value.GetType(), cache);
        }
        else
        {
            cache = _Types[s.GetType (), value.GetType()];
        }

一种解决方案是连接类型的字符串值。类似的东西:

        if ( !_Types.ContainsKey ( s.GetType ().ToString() + ":" +  value.GetType().ToString() ) )
        {
            cache = new ConversionCache ( s.GetType (), value.GetType () );
            _Types.Add ( s.GetType ().ToString() + ":" +  value.GetType().ToString(), cache);
        }
        else
        {
            cache = _Types[s.GetType ().ToString() + ":" +  value.GetType().ToString()];
        }

我知道它会在这种情况下工作,因为类型与其字符串表示之间存在一对一的关系。

但这闻起来很糟糕,在其他情况下也行不通。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# collections


    【解决方案1】:

    您可能需要元组(在 .Net 4 中)或以前版本中的一个众所周知的“Pair”类:KeyValuePair。

    但是 - 考虑到您的要求,我可能会选择自定义课程。您可以确保 hashcode/equals 执行您想要的操作,可以覆盖 ToString() 以进行合理的日志记录,而且它可能读起来更好。

    【讨论】:

      【解决方案2】:

      你这样做的方式很好。如果你想要一个更好的“嗅觉”系统,你只需要一个辅助函数,它接受两个输入(或类型)并返回一个唯一的字符串。然后隐藏生成密钥的实现细节(在这种情况下用“:”分隔符连接它们)。

      对我来说似乎有点过度设计。我不相信您需要更改此密钥生成方法的可能性很大,并且您不是在尝试创建一个泛型类。显然,您需要使用泛型类来做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多