2010-11-16 2 views
0

У меня есть пользовательский объект (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 

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

ответ

4

Вам необходимо переопределить как 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

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

Смежные вопросы