C# 什么';这是基于object';谁的财产?
我试图用C#实现AI的星型算法。大家可能都知道,在我的代码中有一个地方,我想检查C# 什么';这是基于object';谁的财产?,c#,linq,artificial-intelligence,a-star,C#,Linq,Artificial Intelligence,A Star,我试图用C#实现AI的星型算法。大家可能都知道,在我的代码中有一个地方,我想检查节点对象(我在代码中定义的)是否在我的列表节点中。但是由于列表节点中的节点对象与我创建的查看列表中是否存在的对象具有不同的引用,因此我得到的输出是False。(您可以在下面的代码中看到这一点): 类节点 { 布尔州; 节点父节点; 弦作用; int path_成本=0; 公共成本 { 得到 { 返回路径成本; } } 公共节点(布尔[,]映射) { this.state=map; } 公共双启发式() { 返回0;
节点
对象(我在代码中定义的)是否在我的列表节点
中。但是由于列表节点
中的节点
对象与我创建的查看列表中是否存在的对象具有不同的引用,因此我得到的输出是False
。(您可以在下面的代码中看到这一点):
类节点
{
布尔州;
节点父节点;
弦作用;
int path_成本=0;
公共成本
{
得到
{
返回路径成本;
}
}
公共节点(布尔[,]映射)
{
this.state=map;
}
公共双启发式()
{
返回0;
}
}
静态void Main(字符串[]参数)
{
bool[,]a=新bool[,]{{false,false},{true,true};
bool[,]a1=新bool[,]{{false,false},{true,true};
节点温度=新节点(a);
节点n=新节点(a);
节点n1=新节点(a1);
列表节点=新列表();
节点。添加(n);
Console.WriteLine(nodes.Contains(n1));
Console.ReadLine();
}
我读过它,我知道我应该使用LINQ
,它是WHERE
函数。正如您在我的代码中看到的,我想基于节点
的状态
属性检查n1
是否存在,该属性是一个二维布尔数组。使用在哪里
功能是我们在这里可以得到的最佳实践?我的意思是在我的情况下使用它没有任何问题吗?我会使用any()
,而不是Where()
,如下所示:
Console.WriteLine(nodes.Any(n => ... ));
这里的技巧是…
。您提到了基于2D状态数组的比较,但没有提到比较应该是什么样子。每个项目都需要匹配吗?那似乎。。。昂贵的。有更快的比较吗?您是否考虑过重写.Equals()
/GetHashCode()
此外,根据列表的大小和性质,您可以使用字典
或哈希集
做得更好,两者都可能比Any()
做得更好
最后,请注意Eric Lippert对您的问题的评论。他曾在微软的C#团队工作,并有一个博客。这对你来说应该是一个很好的参考。“Where”是一个线性搜索;除非你有理由相信该项目会在列表的最前面找到,否则平均而言,你会在找到它之前搜索列表的一半。如果你需要它比那更快,那么你就必须比天真的“where”更聪明。通常对于A-star,你会使用一个集合,而不是一个列表,集合索引在你关心的(唯一值)属性上。这是次线性搜索。@rthenavar在C#中实际上有一组数据结构;事实上有很多。首先,为什么你认为C#中没有集合数据结构?第二,假设没有这样的结构。你会怎么做?如果我需要的数据结构不存在,我会告诉你我该怎么做:我实现它。你是一名计算机程序员;写一些代码!嗯,你确定C中没有集合结构吗?我正在查看
HashSet
类。是的,我查看了Eric Lippert的解决方案。但我的问题要复杂得多。我要解决的问题是停车场的车辆被封锁。因此,我应该将停车场地图(这是我的州)存储在一个二维布尔数组中。A*应检查列表中是否存在具有相同节点的节点。我还能做什么。。。??
Console.WriteLine(nodes.Any(n => ... ));