HashSet对象的属性需要是键

时间:2018-02-23 15:19:24

标签: c# unity3d data-structures

我有一个Unity项目,其中各种 Cords 在各种 Hooks 之间拉伸。玩家可以从其钩子抓住绳子的一端,携带它并将其连接到另一端。作为此功能的一部分,挂钩需要跟踪哪些绳索连接到它,并且当玩家试图连接新的绳索时,检查这样做是否会“消失”绳索(即它们不是将两端钩住到同一个地方,并且通过连接到两端的相同钩子,绳子不会与另一个绳子合并。)

每个Cord对象都有startend个属性,这些属性引用它所附加的Hook个。目前,我一直在跟踪List

public class Hook : MonoBehaviour {

    List<Cord> attached = new List<Cord>();

    public void Attach(Cord c) {
        if (!ConflictTest(c))
            attached.Add(c);
    }

    public void Detach(Cord c) {
        attached.Remove(c);
    }

    bool ConflictTest(Cord toAttach) {
        foreach (Cord c in attached) {
            // canonically, a cord is grabbed by its 'end', so we only check its 'start'
            if (c.start == toAttach.start || c.end == toAttach.start)
                return true;
        }
        return false;
    }
}

我意识到ConflictTest()中的这种线性搜索实际上在OnMouseEnter()OnMouseDown()处执行并不理想。我想将attached的数据结构更改为HashSet,但有没有办法可以设置,所以我可以根据HashSet的Contains()方法进行测试(即。attached.Contains(toAttach.start))?由于我需要引用集合中每个成员的startend属性,似乎我需要为每个属性设置一个单独的集合(但是如何协调添加和删除?)或者以某种方式允许属性成为键。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是将List<Cord>扩展为Dictionary<Hook, Cord>,其中键代表值Hook的{​​{1}}端点,而不是当前值一。记录的Cord保证是唯一的,因为Hook最多只有一个Hook有效地将其与另一个Cord相关联。以下是这可能的样子(为了清晰起见,额外评论):

Hook

希望这有帮助!如果您有任何问题,请告诉我。