Список равенства объектов с использованием .GetHashCode () - PullRequest
2 голосов
/ 20 июня 2019

Я хотел бы понять, как метод GetHashCode работает со списками объектов на равенство.Для примера:

var user1 = new User { Id = Guid.NewGuid().ToString(), Name = "Chris" };
var user2 = new User { Id = Guid.NewGuid().ToString(), Name = "Jeff" };

var userList1 = new List<User> { user1, user2 }.OrderBy(o => o.Id);
var userList2 = new List<User> { user1, user2 }.OrderBy(o => o.Id);

var usersList1Hash = userList1.GetHashCode();
var usersList2Hash = userList2.GetHashCode();

var userListsEqual = usersList1Hash == usersList2Hash; // false

var userList1Json = JsonConvert.SerializeObject(userList1);
var userList2Json = JsonConvert.SerializeObject(userList2);

var usersList1JsonHash = userList1Json.GetHashCode();
var usersList2JsonHash = userList2Json.GetHashCode();

var userListsJsonEqual = usersList1JsonHash == usersList2JsonHash; // true
  1. Почему списки объектов не равны при сравнении хеш-кодов?

  2. Почему список объектов равен при сериализации в строки JSON и сравнении хеш-кодов?

1 Ответ

0 голосов
/ 20 июня 2019

GetHashCode функция выдает хэш со знаком int32 объекта.

Из MSDN.

Два равных объекта возвращают одинаковые хэш-коды.Однако обратное неверно: одинаковые хеш-коды не подразумевают равенства объектов, поскольку разные (неравные) объекты могут иметь одинаковые хеш-коды.

GetHashCode - это виртуальная функция и может быть переопределена.То, что вы получаете после вызова JsonConvert.SerializeObject, выполняет функцию строки.Класс string имеет собственную реализацию GetHashCode, основанную на содержимом строки.Что-то вроде ниже.Вот почему это соответствует.

public class string {  
  char[] str = null;
  ...
  public string(char[] input) {
    this.str = input;
  }

  public override GetHashCode() {
    //Logic to convert str to int 32 based on string contents;

    return Convert.ToInt32(str);
  }
}
...