ValueTuples 是否适合作为字典键?
Are ValueTuples suitable as dictionary keys?
我想这可能是一本方便的字典:
var myDict = new Dictionary<(int, int), bool>();
散列会是什么样子?
等效的键类型(结构)是什么样的?
是的,没关系。 ValueTuple<...>
系列是一组定义良好的常规结构,具有正确的相等性和哈希码行为,可用作字典键。有一个 slight 警告,因为它们是可变的而不是不可变的,但由于复制语义(这意味着:你不能更改密钥),在这种情况下并没有真正影响它们添加后,因为您只是更改密钥的 不同的副本 ;这与可变 [=] 的问题非常 不同20=] 作为键)。你可以看到 code here.
作为值类型,ValueTuple
的散列遵循默认实现,它基于成员的值:
If value types do not override GetHashCode, the ValueType.GetHashCode
method of the base class uses reflection to compute the hash code
based on the values of the type's fields. In other words, value types
whose fields have equal values have equal hash codes.
元组是可变的,但因为它们是按值复制的,所以您可以安全地将它们用作字典键。如果您使用元组类型的变量,在 Dictionary.Add
中使用此变量,然后修改此变量并尝试使用相同的变量作为键来访问字典中的关联值,则可能会出现问题。在这种情况下,您将无法在字典中找到它。
等效结构如下:
MyStruct : struct
{
public int A;
public int B;
}
我想这可能是一本方便的字典:
var myDict = new Dictionary<(int, int), bool>();
散列会是什么样子?
等效的键类型(结构)是什么样的?
是的,没关系。 ValueTuple<...>
系列是一组定义良好的常规结构,具有正确的相等性和哈希码行为,可用作字典键。有一个 slight 警告,因为它们是可变的而不是不可变的,但由于复制语义(这意味着:你不能更改密钥),在这种情况下并没有真正影响它们添加后,因为您只是更改密钥的 不同的副本 ;这与可变 [=] 的问题非常 不同20=] 作为键)。你可以看到 code here.
作为值类型,ValueTuple
的散列遵循默认实现,它基于成员的值:
If value types do not override GetHashCode, the ValueType.GetHashCode method of the base class uses reflection to compute the hash code based on the values of the type's fields. In other words, value types whose fields have equal values have equal hash codes.
元组是可变的,但因为它们是按值复制的,所以您可以安全地将它们用作字典键。如果您使用元组类型的变量,在 Dictionary.Add
中使用此变量,然后修改此变量并尝试使用相同的变量作为键来访问字典中的关联值,则可能会出现问题。在这种情况下,您将无法在字典中找到它。
等效结构如下:
MyStruct : struct
{
public int A;
public int B;
}