ValueTuples是否适合用作字典键?

时间:2018-12-18 10:31:39

标签: c# dictionary valuetuple

我认为这可能是一本方便的字典:

var myDict = new Dictionary<(int, int), bool>();

散列是什么样的?
等效键类型(结构)是什么样的?

2 个答案:

答案 0 :(得分:13)

是的,很好。 ValueTuple<...>系列是一组定义良好的常规结构,它们具有正确的等式和哈希码行为,可以用作字典键。有一个轻微警告,它们是可变的而不是不可变的,但是由于存在复制语义,因此在这种情况下并不会真正影响它们(这意味着:拥有密钥之后,您不能再更改密钥了)已添加,因为您只更改了密钥的不同副本;这与可变类作为密钥的问题非常不同)。您可以看到code here

答案 1 :(得分:3)

作为一种值类型,ValueTuple的哈希遵循默认实现,该默认实现基于成员的值:

  

如果值类型未覆盖GetHashCode,则为ValueType.GetHashCode   基类的方法使用反射来计算哈希码   根据类型字段的值。换句话说,值类型   字段值相等的哈希码也相同。

变量是可变的,但是由于它们是按值复制的,因此您可以安全地将它们用作字典键。问题可能是,如果您使用元组类型的变量,请在Dictionary.Add中使用此变量,然后修改此变量,然后尝试使用相同的变量作为键来访问字典中的关联值。在这种情况下,您将无法在字典中找到它。

等效结构如下:

MyStruct : struct
{
    public int A;
    public int B;
}