A HashKey
- это значение, рассчитанное для проверки, может ли вызов Equals()
дать результат, который true
.
Хэш-ключ используется для быстрого принятия решения, если элемент может быть правильным или если он наверняка является ложным.
Прежде всего, замените формулировку HashKey
на Unique Id
.
Если вам нужен уникальный Id, я бы порекомендовал использовать базу данных со столбцом Id, если вы все равно сохраните ее там, а затем получите Id с другими данными. + В БД mongo каждая запись также имеет собственный идентификатор:
Смотри здесь
Каждый объект в Монго уже имеет идентификатор, и они могут быть отсортированы в
порядок вставки. Что не так с получением коллекции пользователя
объекты, перебирающие его и использующие в качестве увеличенного идентификатора? [...]
Таким образом: используйте БД для уникального идентификатора и вычислите HashKey
(если вам это нужно больше) с помощью простой дешевой математики, такой как добавление идентификаторов пользователей.
Чтобы сделать это программно:
Если вы хотите проверить его программно, а мы игнорируем идентификаторы из БД, вам необходимо реализовать функцию GetHashKey () и функцию Equals () для указанных объектов.
class Group
{
public Collection<int> UserIds { get; set; }
public int CreateByUserId { get; set; }
public override bool Equals(object obj)
{
Group objectToCompare = (Group)obj;
if (this.UserIds.Count != objectToCompare.UserIds.Count)
return false;
if (this.CreateByUserId != objectToCompare.CreateByUserId)
return false;
foreach (int ownUserId in this.UserIds)
if (!objectToCompare.UserIds.Contains(ownUserId))
return false;
//some elements might be double, i.e. 1: 1,2,2 vs 2: 1,2,3 => not equal. cross check to avoid this error
foreach (int foreignUserId in objectToCompare.UserIds)
if (!this.UserIds.Contains(foreignUserId))
return false;
return true;
}
public override int GetHashCode()
{
int sum = CreateByUserId;
foreach (int userId in UserIds)
sum += userId;
return sum;
}
}
Использование:
Group group1 = new Group() { UserIds = ..., CreateByUserId = ...};
Group group2 = new Group() { UserIds = ..., CreateByUserId = ...};
group1.Equals(group2);
Вот ответ на вопрос «Зачем нам нужна функция GetHashCode при использовании Equals?»
Примечание. Это, безусловно, не самое эффективное решение для Equals()
-Метода здесь. Отрегулируйте при необходимости.