2

静的分析パッケージの一部である次のクラスがあります。

  • オブジェクトはMetricKey辞書キーとして使用されます。
  • DecisionMetricUnitPortfolio​​はすべて列挙型です。

辞書のキーマッチングを機能させるには、等式演算子(==)をオーバーライドする必要がありました。http://msdn.microsoft.com/en-us/library/ms173147.aspxのガイダンスを使用しました。ガイダンスでは、実行したGetHashCodeメソッドをオーバーロードする必要があると述べていますが、XOR(^)演算で列挙型を整数にキャストすることの意味を理解していません。私が行ったことは有効ですか、それとも列挙型整数値が重複しているために競合するハッシュコードを取得しますか?:

public class MetricKey
{
    public MetricKey(Decision decision, MetricUnit metricUnit, Portfolio portfolio)
    {
        Decision = decision;
        Unit = metricUnit;
        Portfolio = portfolio;
    }

    public Decision Decision { get; private set; }
    public MetricUnit Unit { get; private set; }
    public Portfolio Portfolio { get; private set; }

    public static bool operator == (MetricKey a, MetricKey b)
    {
        if (ReferenceEquals(a, b))
            return true;
        if (((object) a == null) || ((object) b == null))
            return false;
        return a.Decision == b.Decision && a.Unit == b.Unit && a.Portfolio == b.Portfolio;
    }

    public static bool operator != (MetricKey a, MetricKey b)
    {
        return !(a == b);
    }

    public override bool Equals(System.Object obj)
    {
        if (obj == null)
            return false;
        var metricKey = obj as MetricKey;
        if ((System.Object) metricKey == null)
            return false;
        return Decision == metricKey.Decision && Unit == metricKey.Unit && Portfolio == metricKey.Portfolio;
    }

    public bool Equals(MetricKey metricKey)
    {
        if ((object) metricKey == null)
            return false;
        return Decision == metricKey.Decision && Unit == metricKey.Unit && Portfolio == metricKey.Portfolio;
    }

    public override int GetHashCode()
    {
        return (int)Decision ^ (int)Unit ^ (int)Portfolio;
    }
}
4

1 に答える 1

3

キャストに問題はありませんが、int実際にはxorは避けますが、列挙型の可能性のある値(1、2、3など)との衝突を簡単に作成できます。衝突は何も壊さないことに注意してください、しかしそれらは物事をより高価にすることができます。私は次のようなものを使用するかもしれません(C#コンパイラの匿名型の処理からインスピレーションを得てランダムに選ぶ):

int num = -1962473570;
num = (-1521134295 * num) + (int)Decision;
num = (-1521134295 * num) + (int)Unit;
return (-1521134295 * num) + (int)Portfolio;
于 2010-02-23T19:34:50.677 に答える