基于对象属性之一在List中查找对象的最佳实践是什么?

时间:2017-04-11 17:08:53

标签: c# linq artificial-intelligence a-star

我正在尝试在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函数最佳实践吗?我的意思是在我的情况下使用它没有任何问题吗?

1 个答案:

答案 0 :(得分:1)

而不是Where(),我使用Any(),如下所示:

Console.WriteLine(nodes.Any(n => ... ));

这里的诀窍是...。您提到了基于2D状态数组的比较,但没有提到比较应该是什么样的。每个项目都需要匹配吗?这似乎......很贵。是否有更快的比较?您是否考虑过覆盖.Equals() / GetHashCode()

此外,根据您的列表的大小和性质,使用DictionaryHashSet可能会做得更好,两者都可能比Any()做得更好。< / p>

最后,请注意Eric Lippert对您提问的评论。他曾在微软的C#团队工作过,并且有一个他所在的博客already implemented A*。这对你来说应该是一个很好的参考。