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

根据评论复制我的评论:)。为什么需要哈希值?简单地使用默认的对象散列函数有什么问题?如果这是一棵完整的二叉树,您可以将节点映射到整数值,但是对于任意 n 叉树,我看不到将位置编码为值的简单方法。

于 2011-02-10T21:33:07.723 回答
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 回答
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 回答