我想这可能是一本方便的字典:
var myDict = new Dictionary<(int, int), bool>();
哈希会是什么样子?
等效的键类型(结构)是什么样的?
我想这可能是一本方便的字典:
var myDict = new Dictionary<(int, int), bool>();
哈希会是什么样子?
等效的键类型(结构)是什么样的?
是的,没关系。该ValueTuple<...>
族是一组定义明确的常规结构,具有正确的相等性和哈希码行为,可用作字典键。有一点需要注意的是,它们是可变的而不是不可变的,但是由于复制语义,这在这种情况下并没有真正影响它们(这意味着:在添加密钥后,您无法更改密钥,因为您是只更改密钥的不同副本;这与可变类作为密钥的问题非常不同)。您可以在此处查看代码。
作为一个值类型,hashValueTuple
遵循默认实现,它基于成员的值:
如果值类型不覆盖 GetHashCode,则基类的 ValueType.GetHashCode 方法使用反射来根据类型字段的值计算哈希码。换句话说,其字段具有相同值的值类型具有相同的哈希码。
元组是可变的,但因为它们是按值复制的,所以您可以安全地将它们用作字典键。如果您使用元组类型的变量,则可能会出现问题,在 中使用此变量Dictionary.Add
,然后修改此变量并尝试使用与键相同的变量来访问字典中的关联值。在这种情况下,您不会在字典中找到它。
等效结构如下:
MyStruct : struct
{
public int A;
public int B;
}