Подходят ли ValueTuples в качестве ключей словаря? - PullRequest
0 голосов
/ 18 декабря 2018

Я думаю, что это может быть удобный словарь:

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

Как будут выглядеть хэши?
Как будет выглядеть эквивалентный тип ключа (структура)?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Будучи типом значения, хэш для ValueTuple следует реализации по умолчанию, которая основана на значениях членов:

Если типы значений не переопределяют GetHashCode, ValueType.GetHashCodeМетод базового класса использует отражение для вычисления хеш-кода на основе значений полей типа.Другими словами, типы значений, поля которых имеют равные значения, имеют одинаковые хеш-коды.

Кортежи являются изменяемыми, но поскольку они копируются по значению , их можно безопасно использовать в качестве словаря.ключи.Проблема может заключаться в том, что если вы используете переменную типа кортежа, используйте эту переменную в Dictionary.Add, затем измените эту переменную и попытаетесь получить доступ к связанному значению из словаря, используя ту же переменную, что и ключ.В этом случае вы не найдете его в словаре.

Эквивалентная структура будет выглядеть следующим образом:

MyStruct : struct
{
    public int A;
    public int B;
}
0 голосов
/ 18 декабря 2018

Да, все в порядке.Семейство ValueTuple<...> - это четко определенный набор регулярных структур с правильным равенством и поведением хэш-кода для работы в качестве ключей словаря.Существует незначительное предостережение в том, что они являются изменяемыми, а не неизменяемыми, но это не влияет на них в этом контексте благодаря семантике копирования (что означает: вы не можете изменить ключ после того, как он былдобавлено, поскольку вы меняете только другую копию ключа; это очень отличается от проблемы с изменяемыми классами в качестве ключей).Вы можете увидеть код здесь .

...