使用两个字段的组合作为字典中的键

时间:2011-02-09 17:18:30

标签: c# dictionary hash

我需要存储一个c#dict,我可以根据IntPtr和enum存储成员(如果有帮助的话,可以转换为int)。换句话说,如果我得到IntPtr和enum(名为sp_playlist_type)的相同匹配,我需要能够得到相同的结果,但只有那时(这也很重要)。我想我会创建一个包含这两个的结构,并覆盖GetHashCode(),但是我需要一个不会为这两个数字创建重复的散列算法,并且每次都生成相同的结果有两个数字。

4 个答案:

答案 0 :(得分:7)

  

然后我需要一个不会为这两个数字创建重复的散列算法

实际上并非如此。您需要覆盖GetHashCode(),但它可能会发生冲突。您希望最小化哈希代码中的冲突,而不是消除它们。

这实际上相当容易。一个常见的选择是只使用结构的两个成员的哈希码的XOR,或类似的东西。

答案 1 :(得分:6)

我认为基于已经创建了Tuple GetHashCode和Equality的方式,您可以:

Dictionary<Tuple<IntPtr, YourEnum>, YourResultType>

如果您当时使用的是.NET 4.0。

答案 2 :(得分:1)

一种简单的方法是使用字符串作为键,在这个字符串中组合两个值。例如:

private string GetKey(IntPrt prt, sp_playlist_type playlist_type)
{
    return string.format("{0}#{1}", prt, type)
}

要使用它,请使用以下内容:

mydic.add(GetKey(ptr, playlist_type), myvalue);

答案 3 :(得分:0)

覆盖GetHashCode并不是绝对必要的,因为正如其他人所提到的那样,并不要求它是唯一的。

但是出于性能原因,可能需要为结构重写等于as described in MSDN

在这种情况下,它是recommended to override GetHashCode。在这种情况下,可能是IntPtr和枚举的异或(64位系统上IntPtr的LS 32位)。