4

カスタムクラスのHashSetがあります。

public class Vertex
{
    public string Name;

    public override bool Equals(object obj)
    {
        var vert = obj as Vertex;
        if (vert !=null)
        {
            return Name.Equals(vert.Name, StringComparison.InvariantCulture);
        }
        return false;
    }
}

そして今、私は2つのハッシュセットを持っています

HashSet<Vertex> hashSet1 = new HashSet<Vertex>();

HashSet<Vertex> hashSet1 = new HashSet<Vertex>();

そして今、hashSet1にhashSet2にない頂点だけを入れたいので、ExceptWithメソッドを使用します

hashSet1.ExceptWith(hashSet2);

しかし、これは機能しません。私は複雑なタイプを持っているので、これはうまくいかないと思います。したがって、問題は次のとおりです。これを機能させるには、Vertexクラスに実装する必要のあるインターフェイスがありますか?HashSetの作成中に、EqualityComparerを渡すことができることは知っていますが、Vertexクラスにいくつかの比較インターフェイスメソッドを実装する方がよりエレガントであるように思われます。

それは可能ですか、それとも私はsthを理解していませんか?

ありがとう。

4

4 に答える 4

4

オーバーライドEqualsするときは、もオーバーライドする必要がありますGetHashCodeHashSet(およびのような他のハッシュ構造Dictionary)は、要素をと比較する前に、最初にオブジェクトのハッシュコードを計算して、オブジェクトを構造内に配置しますEquals

public override int GetHashCode()
{
    return StringComparer.InvariantCulture.GetHashCode(this.Name);
}
于 2013-03-16T15:01:13.940 に答える
3

インターフェースを実装する必要はありません(ただしIEquatable<T>)。等式比較器を指定せずにハッシュセットを作成すると、デフォルトでを使用しEqualityComparer<T>.Defaultます。これは、オブジェクト自体に相互に比較するように要求します(特殊な場合のnull参照)。

ただし、あなたの場合、オーバーライドしていないため、平等契約は破られていますGetHashCode。これが私があなたのタイプを修正する方法です:

public class Vertex : IEquatable<Vertex>
{
    public string Name { get; private set; }

    public Vertex(string name)
    {
        Name = name;
    }

    public override int GetHashCode()
    {
        return StringComparer.InvariantCulture.GetHashCode(Name);
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Vertex);
    }

    public bool Equals(Vertex obj)
    {
        return obj != null && StringComparer.InvariantCulture.Equals(Name, obj.Name);
    }
}
于 2013-03-16T15:06:55.243 に答える
1

オーバーライドして.GetHashCode()もよろしいですか?

これがリファレンスです。

于 2013-03-16T15:00:19.770 に答える
0

オーバーライドGetHashCodeEqualsオーバーライドする必要があります。

Object.Equalsメソッド

Equals(Object)をオーバーライドする型は、GetHashCodeもオーバーライドする必要があります。そうしないと、ハッシュテーブルが正しく機能しない可能性があります。

于 2013-03-16T15:00:26.267 に答える