Как реализовать GetHashCode для структуры с двумя строками, когда обе строки являются взаимозаменяемыми - PullRequest
66 голосов
/ 16 сентября 2008

У меня есть структура в C #:

public struct UserInfo
{
   public string str1
   {
     get;
     set;
   }

   public string str2
   {
     get;
     set;
   }   
}

Единственное правило: UserInfo(str1="AA", str2="BB").Equals(UserInfo(str1="BB", str2="AA"))

Как переопределить функцию GetHashCode для этой структуры?

Ответы [ 14 ]

0 голосов
/ 16 сентября 2008

Результат GetHashCode должен быть:

  1. Как можно быстрее.
  2. Как можно более уникально.

Имея это в виду, я бы сказал что-то вроде этого:

if (str1 == null)
    if (str2 == null)
        return 0;
    else
       return str2.GetHashCode();
else
    if (str2 == null)
        return str1.GetHashCode();
    else
       return ((ulong)str1.GetHashCode() | ((ulong)str2.GetHashCode() << 32)).GetHashCode();

Редактировать: Забыл нули. Код исправлен.

0 голосов
/ 16 сентября 2008

Сортируйте их, затем объедините:

return ((str1.CompareTo(str2) < 1) ? str1 + str2 : str2 + str1)
    .GetHashCode();
0 голосов
/ 16 сентября 2008

Возможно что-то вроде str1.GetHashCode () + str2.GetHashCode ()? или (str1.GetHashCode () + str2.GetHashCode ()) / 2? Таким образом, было бы то же самое независимо от того, были ли поменяны местами str1 и str2 ....

0 голосов
/ 16 сентября 2008

Много возможностей. Например,

return str1.GetHashCode() ^ str1.GetHashCode()

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