3

各アイテムは次のようになります。

public interface IEffect
{
    string Name { get; }
    bool Compute ( );

    List<IEffect> SubEffects { get; set; }
    IEffect ElseIfEffect { get; set; }
}

これらのアイテムの多くのインスタンスを相互に接続してツリーのような構造を形成することで、ツリーのような構造を作成したいと思います。しかし、後で各アイテムをディクショナリにハッシュしたいので、ツリー上のどこにあるかに基づいてハッシュ値を作成できれば、一意の十分なハッシュ値を取得できると思いました。

これを行う方法についてのアイデアはありますか?

4

5 に答える 5

4

ツリー上の位置に基づいて

その情報はノードの一部ではなく、ツリーの一部です。したがって、それは非常に悪い考えです (外部要因で何かの HashCode を定義する)。

幸いなことに、@spintheblack が指摘しているように、ここで GethashCode() をオーバーライドする理由はまったくありません。

于 2011-02-10T21:34:11.097 に答える
2

インターフェイス IEffect を実装するすべてのアイテムは、ToString と GetHashCode をオーバーライドする必要があります

ToString には、選択した値を含む IEffect プロパティの一意の状態が含まれている必要があります GetHashCode は ToString().GetHashCode() である必要があります

オブジェクトの内部データに基づいて、オブジェクトごとに一意のハッシュがあります。

于 2011-02-10T21:38:53.130 に答える
2

これでうまくいくはずです。警告: このメソッドで GetHashCode をオーバーライドしないでください。親エンティティ内のオブジェクトの位置が変更されたため、GetHashCode を変更しないでください。このトリックは、ハッシュ コードに他の計画がある場合にのみ使用してください。これは、あなたが求めることを行うべきものの大まかなサンプルです。これは、現在の親の位置を見つける方法を示しているだけですが、親がなくなるまでツリーをたどることができます。

class MyEffect : IEffect
{
    IEffect _owner;
    public MyEffect(IEffect owner) 
    {
        _owner = owner;
    }

    public int GetFunkyHash()
    {
        int hash = this.GetHashCode();
        int index = _owner.IndexOf(item);
        return hash | index.GetHashCode();
    }
}
于 2011-02-10T21:41:43.470 に答える
2

コメントごとに私のコメントからコピーしました:)。なぜハッシュ値が必要なのですか? 単純にデフォルトのオブジェクト ハッシュ関数を使用することの何が問題になっていますか? これが完全な二分木である場合、ノードを整数値にマップできますが、任意の n 分木では、位置を値にエンコードする簡単な方法がわかりません。

于 2011-02-10T21:33:07.723 に答える
1

これが私があなたが本当にする必要があると思うことをした方法です。これにより、ツリー処理エフェクト全体がウォークされます。ツリーの途中から開始する必要がない限り、親にリンクする必要はありません。もちろん、これはあなたがやろうとしていることに対する私の勝手な解釈です。

public void HandleEffects(IEffect effect)
{
    if(effect.Compute())
        foreach(IEffect child in effect.SubEffects)
            HandleEffects(child);

    else
        HandleEffect(effect.ElseEffect);
}
于 2011-02-10T22:46:10.210 に答える