0

DataPointCollection2 つの Integer プロパティと 1 つの Guid プロパティを持つカスタム オブジェクト ( ) があります。そのオブジェクトで HashCode を生成して、これらのプロパティで同じ値を持つ 2 つのオブジェクトが 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

2 に答える 2

4

GetHashCode両方をオーバーライドする必要がありますEquals- によって使用されるのは 2 つの組み合わせですHashSet

等価チェックは次のようにする必要があります。

  • 他のオブジェクトがこのオブジェクトと同じ型であることを確認します (DataPointCollectionシール型の場合は簡単です。等価性と継承を組み合わせると厄介です)。
  • 3 つのフィールドが等しいかどうかを比較します

ハッシュ コード チェックでは、3 つのフィールドを組み合わせる必要があります。結果は一意である必要はありません。2 つの等しくないオブジェクトのハッシュ コードが異なると、パフォーマンスが向上しますが、必須ではありません。絶対的な要件は、2 つの等しいオブジェクト同じハッシュ コードを持つことです。私はこのようなことをします(C#、しかしVBに変換するのは簡単です):

public override int GetHashCode()
{
    int hash = 17;
    hash = hash * 31 + projectId;
    hash = hash * 31 + roleId;
    hash = hash * 31 + resourceGuid.GetHashCode();
    return hash;
}
于 2010-11-16T15:39:19.643 に答える
1

私があなたを正しく理解していれば、クラスのメソッドGetHashCodeEqualsメソッドをオーバーライドし、この質問のメソッドを使用してハッシュコードを生成するだけです。DataPointCollection

于 2010-11-16T15:38:01.440 に答える