Использование комбинации двух полей в качестве ключа в словаре - PullRequest
3 голосов
/ 09 февраля 2011

Мне нужно хранить диктант на c #, где я могу хранить членов на основе IntPtr и enum (можно преобразовать в int, если это поможет). Другими словами, если я получу одинаковое совпадение IntPtr и enum (с именем sp_playlist_type), мне нужно будет получить тот же результат, но только тогда (это также важно). Я подумал, что сделаю структуру, содержащую два, и переопределю GetHashCode (), но тогда мне понадобится алгоритм хеширования, который не создает дубликаты для двух чисел и генерирует один и тот же результат каждый раз, когда присутствуют два числа.

Ответы [ 4 ]

7 голосов
/ 09 февраля 2011

тогда мне нужен алгоритм хеширования, который не создает дубликаты для двух чисел

Это на самом деле не так. Вам нужно переопределить GetHashCode(), но это может привести к коллизиям. Вы хотите минимизировать коллизии в своих хэш-кодах, а не устранять их.

Это на самом деле довольно легко сделать. Обычный вариант - просто использовать XOR хеш-кодов обоих членов структуры или что-то подобное.

6 голосов
/ 09 февраля 2011

Я думаю, основываясь на том, как уже созданы GetHashCode и Equality Tuple, вы можете иметь:

Dictionary<Tuple<IntPtr, YourEnum>, YourResultType>

Если вы, конечно, используете .NET 4.0.

1 голос
/ 09 февраля 2011

Простой способ сделать это - использовать строку в качестве ключа, вы объединяете в этой строке оба значения.Например:

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

Чтобы использовать его, вы используете что-то вроде:

mydic.add(GetKey(ptr, playlist_type), myvalue);
0 голосов
/ 09 февраля 2011

Строго не нужно переопределять GetHashCode, поскольку, как отмечают другие, для его уникальности не требуется.

Однако может быть желательно переопределить Equals для вашей структуры из соображений производительности , как описано в MSDN .

В этом случае рекомендуется переопределить GetHashCode . Вероятно, в этом случае XOR IntPtr и enum (LS 32-битный IntPtr в 64-битной системе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...