【问题标题】:How to implement a Dictionary with two keys?如何用两个键实现字典?
【发布时间】:2015-04-14 11:15:40
【问题描述】:

使用 C#,我想找到一种方法来实现依赖于两个关键对象的字典之类的东西。

我有一个对象和一个字符串。我想为这两个值分配一个双精度值。那么我应该使用什么结构呢?或者我该如何实现这样的结构?

【问题讨论】:

  • 您要按每个键分别查找吗?如果是,那么它会取消已经给出的大多数答案。
  • 您是否需要对象和字符串来形成唯一键,或者对象是唯一键,而字符串是另一个唯一键,并且您希望能够使用任一方法查找值钥匙?
  • @Euphoric 和 Ben Voigt 我需要这两个对象来形成唯一键

标签: c# .net


【解决方案1】:

尝试使用类似的东西

Dictionary<Tuple<object,string>,double>

【讨论】:

  • 我没有意识到 .net 4.0 添加了元组,当需要有 2 个对象的元组时不再使用 KeyValuePair!
  • 在 4.0 中也非常好,因为匿名类 var temp = new { value1 = 2 ,value2 = "some string"} 用于临时用途
  • @Stecya C# 3 实际上有匿名类型
  • @RichK 你能更详细地解释一下吗?我使用的是 .net 3.5,正如我应该说的那样
  • @Roflcopter 我不确定匿名类型是否能帮助您解决问题我只是让 Stecya 知道它们不是 C# 4 独有的。如果您想了解更多关于匿名类型的信息大量在线资源可以指导您。
【解决方案2】:

您可以有一个聚合这两个属性的自定义类,覆盖其上的GetHashCode 方法,然后拥有一个IDictionary&lt;CustomClass, double&gt;

【讨论】:

  • 谢谢。我总是用压倒一切的等于来尝试它。我认为在 Java 中这是用来比较的。
  • 总是需要同时覆盖 EqualsGetHashCode 以使它们保持一致。如果它们不一致,字典就会出错。
【解决方案3】:

如果您使用的是 .NET 3.5,则不能使用元组,因为它们是在 .NET 4 中添加的。

但是您可以轻松创建类,该类将包含您的两个键,并且可以用作字典中的键。唯一要做的就是在你的 key 类中重写 Equals()GetHashCode() 方法,这样 Dictionary 就可以正确地使用它作为 key。

这些应该通过相等或散列你的两个键来实现逻辑。以及更多相关信息:GetHashCode vs. Equals

【讨论】:

    【解决方案4】:

    您不一定需要。如果你的对象已经覆盖了 Object 的 GetHashCode 成员。

    Dictionary<string, double> myDict = new Dictionary<string, double>();
    
    myDict[myObj.GetHashCode() + myString] = myDouble;
    

    【讨论】:

    • 使用 .net 哈希码,这是一种不确定的实现。我以前使用过这种技术,它带有唯一的用户 ID 以及文件的 MD5 哈希(十六进制字符串)。当连接的两个字符串具有预期长度时,它会更好地工作,因为这会消除碰撞的可能性。
    • 完全坏掉了。如果两个对象具有相同的 HashCode,它们将获得相同的字符串键,从而共享一个字典条目。
    • 具有相同 HashCode 的对象会导致冲突,即使您只使用该对象本身也是如此,因为字典的默认比较器依赖于 GetHashCode。
    • 不同之处在于,对于标准字典,碰撞仅意味着轻微减速(除非很多碰撞,在这种情况下会减速很大)但不影响正确性。对于您的代码,冲突意味着错误。
    • 您能详细说明一下吗?字符串的处理方式是否与其他对象不同?
    【解决方案5】:

    创建一个类作为您的关键:

    public class MyKey
    {
        public String Str;
        public Object Obj;
    }
    

    然后:

    Dictionary<MyKey, double> MyDict = new Dictionary<MyKey, double>();
    

    【讨论】:

    • 如果不覆盖 EqualsGetHashCode 就行不通,因为默认情况下类使用引用相等。
    • 如果您改用结构,它可能会起作用。但是我并没有深入研究 struct equals 的默认实现。
    猜你喜欢
    • 2018-01-28
    • 2013-08-06
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多