我正在尝试在C#中实现AI的A star算法。正如大家可能知道的那样,我的代码中有一些地方可以检查['Event.txt', 'Location.txt', 'Place_name.txt', 'Place_add.txt', 'Place_pin.txt']
对象(我在代码中定义的对象)是否在Node
中。但由于List<Node> nodes
中的Node
对象与我创建的对象具有不同的引用,以查看列表中是否存在,因此我获得的输出为List<Node> nodes
。 (您可以在下面的代码中看到这一点):
False
我已经读过它了,我知道我应该使用class Node
{
bool[,] state;
Node parent;
String action;
int path_cost=0;
public int Cost
{
get
{
return path_cost;
}
}
public Node (bool[,] map)
{
this.state = map;
}
public double Heuristic()
{
return 0;
}
}
static void Main(string[] args)
{
bool[,] a = new bool[,] { { false, false }, { true, true } };
bool[,] a1 = new bool[,] { { false, false }, { true, true } };
Node temp = new Node(a);
Node n = new Node(a);
Node n1 = new Node(a1);
List<Node> nodes = new List<Node>();
nodes.Add(n);
Console.WriteLine(nodes.Contains(n1));
Console.ReadLine();
}
并且它是LINQ
函数。正如您在我的代码中看到的,我想根据WHERE
的{{1}}属性检查n1
是否存在,该属性是一个二维的布尔数组。我们可以使用Node
函数最佳实践吗?我的意思是在我的情况下使用它没有任何问题吗?
答案 0 :(得分:1)
而不是Where()
,我使用Any()
,如下所示:
Console.WriteLine(nodes.Any(n => ... ));
这里的诀窍是...
。您提到了基于2D状态数组的比较,但没有提到比较应该是什么样的。每个项目都需要匹配吗?这似乎......很贵。是否有更快的比较?您是否考虑过覆盖.Equals()
/ GetHashCode()
?
此外,根据您的列表的大小和性质,使用Dictionary
或HashSet
可能会做得更好,两者都可能比Any()
做得更好。< / p>
最后,请注意Eric Lippert对您提问的评论。他曾在微软的C#团队工作过,并且有一个他所在的博客already implemented A*。这对你来说应该是一个很好的参考。