List.Contains 总是返回 false

List.Contains always returning false

我正在尝试实现一个非常基本的 A* 实现。

我有一个 'completed' 列表,其中包含所有先前评估的节点的坐标。

为了争论,假设我正在尝试从 (1,0) 到 (3,0)。

第三次迭代后,我的 'completed' 列表包含 (1,0) 和 (2,0)。它目前正在评估 2,0 左右的所有邻居。这包括已经评估的 (1,0)。

调用 completed.Contains(neighbor) 时,neighbor = (1,0) 应该 return 为真。但是它不知何故不符合条件。从而创建一个重复节点并在无限循环中进行评估。

下面是正在发生的事情的代码示例。 Point = 包含 X 和 Y 的简单对象。

point1 = new Point(1,0);
point2 = new Point(2,0);
neighbour = point1;

var completed = new List<Point>();
completed.Add(point1);
completed.Add(point2);

if(completed.Contains(neighbour))
{
     // Do something. (In my code, this should break a loop, so...)
     continue;
}
// However, this is happening instead...
if(!completed.Contains(neighbour))
{
    // Adds to the list of the next node to be worked on. Thus creating a loop.
}

在我的实际代码中有更多关于这些 if 的条件,但为了论证和我的理智,我将它们设为上述基本条件,但无济于事。我不确定为什么它看不到现有价值。是因为我不看价值本身,而只看索引吗? (因此 1,0 永远不存在)?

方法List<T>.Contains使用方法T.Equals进行比较。你应该为你的点覆盖 Equals class.

https://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx