Генерация хеш-кода для объекта - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть пользовательский объект (DataPointCollection) с двумя свойствами Integer и свойством Guid.Я хочу, чтобы этот объект генерировал HashCode, чтобы два объекта с одинаковыми значениями в этих свойствах не добавлялись в HashSet.Я знаю, что мне нужно переопределить метод GetHashCode(), но как мне сгенерировать хеш-код для этого?

Вот как я хочу его использовать.

Dim dataPointCollections As New HashSet(Of DataPointCollection)()

For Each row As DataRow In myDataSet.Tables(0).Rows

  Dim dataPointCollection As New DataPointCollection()
  dataPointCollection.ProjectID = row("ProjectID") 'Integer'
  dataPointCollection.RoleID = row("RoleID") 'Integer'
  dataPointCollection.ResourceGUID = row("ResourceGUID") 'Guid'

  If Not dataPointCollections.Contains(dataPointCollection) Then
    dataPointCollections.Add(dataPointCollection)
  End If

Next

I 'Я открыт для других идей, но я подумал, что это может быть быстрее, чем выполнение запроса LINQ для коллекции объектов (таких объектов может быть очень много).

Ответы [ 2 ]

4 голосов
/ 16 ноября 2010

Вам необходимо переопределить GetHashCode и Equals - это комбинация из двух, которые будут использоваться HashSet.

Ваша проверка на равенство должна:

  • Убедитесь, что другой объект относится к тому же типу, что и этот объект (проще, если DataPointCollection является запечатанным типом; равенство и наследование запутаны при объединении)
  • Сравните три поля на равенство

Ваша проверка хеш-кода должна объединить три поля;результат не должен быть уникальным;для производительности лучше , если два неравных объекта имеют разный хеш-код, но это не обязательно.Абсолютное требование состоит в том, чтобы два равных объекта do имели одинаковый хэш-код.Я бы сделал что-то вроде этого (C #, но легко конвертировать в VB):

public override int GetHashCode()
{
    int hash = 17;
    hash = hash * 31 + projectId;
    hash = hash * 31 + roleId;
    hash = hash * 31 + resourceGuid.GetHashCode();
    return hash;
}
1 голос
/ 16 ноября 2010

Если я вас правильно понимаю, вам просто нужно переопределить методы GetHashCode и Equals в вашем классе DataPointCollection и использовать метод из этого вопроса для генерации хеш-кода.

...