3

プロパティ A、B、C、D、StartDate、EndDate を持つオブジェクトの場合、A、B、C が同一で日付範囲が重複している場合に 2 つのオブジェクトが等しいものを実装したい場合、どうすればよいでしょうか?

私はそのようにEqualityComparerを作成しようとしました

    public override bool Equals(RateItem x, RateItem y)
    {
        bool equal = true;
        if ((x.A != y.A || x.B != y.B || x.C != y.C ||
            (x.StartDate < y.StartDate && x.EndDate <= y.StartDate) ||
            (x.StartDate > y.StartDate && y.EndDate <= x.StartDate)))
        { equal = false; }
        return equal;
    }

しかし、フレームワークの多くの場所が Equals を無視して GetHashCode を使用しているようで、ドキュメントはそれについてまったく明確ではありません。GetHashCode を実装するときに、日付を無視せずに HashCode を同じにする方法がわかりません。

もう少し具体的にすると、これはプロジェクト管理とレートに関係しています。同じ役割の同じプロジェクトの同じ人物が、同じ期間に異なる料金を請求できないというビジネス ルールを実装したいと考えています。したがって、Project DeathMarch で DBA の役割を果たしている Bob は、自分の時間を記録するために、任意の時点で 1 つの有効な請求レートしか持つことができません。彼が同じ期間に別のレートで QA アナリストの役割で数時間を記録する必要がある場合は、問題ありません。これは大規模な既存システムであるため、ドメイン オブジェクト構造を変更することはできません。

4

3 に答える 3

4

これは不可能です。

.Net の等価性は推移的でなければなりません。つまり、 ifa == bb == c、 then a == c.

于 2010-07-16T18:56:41.400 に答える
1

可能です。GetHashCodeの唯一のルールは、A == Bの場合はA.GetHashCode()がB.GetHashCode()と等しくなければならないということです。逆に、A == Bの場合はA.GetHashCode()== B.GetHashCode()は本当。

したがって、GetHashCodeを次のように簡単に作成できます

public override int GetHashCode()
{
    return A.GetHashCode() ^ B.GetHashCode() ^ C.GetHashCode();
}

GetHashCodeはID用ではありません!! これは、「類似した」オブジェクトをグループ化するために使用されます。

証拠:

string a = "a";
string b = "EUKCnPMLpp";
Console.WriteLine("a = '{0}', b = '{1}', Same = {2}", a, b, a == b);
Console.WriteLine("a.GetHashCode() = {0}, b.GetHashCode() = {1}, Same = {2}", a.GetHashCode(), b.GetHashCode(), a.GetHashCode() == b.GetHashCode());
于 2010-07-16T19:12:59.503 に答える
0

ハッシュテーブル内のアイテムを使用している場合は、最初にGetHashCodeメソッドを使用して等しいかどうかをテストし、ハッシュが等しいことがわかった場合は、Equalsメソッドを呼び出して等しいかどうかを確認します。

ドキュメントから:

「しかし、ハッシュテーブルがそれらが同一のオブジェクトであると判断するには十分ですか?残念ながら、いいえ。ハッシュテーブルが同じハッシュを持つ2つのオブジェクトを検出すると、Equalsメソッドを呼び出して、2つのオブジェクトが実際に等しいかどうかを確認します。これもデフォルトです。 2つのオブジェクトが同じクラスの2つの異なるインスタンスである場合、Object.Equalsの実装はfalseを返します。したがって、クラスにEqualsメソッドのオーバーライドも追加する必要があります。

于 2010-07-16T19:04:34.947 に答える