【发布时间】:2013-02-04 17:30:10
【问题描述】:
我有一个struct,其中包含一些int 和bool 成员,我希望从列表中获得最低值(实际上是在制作基于A* 搜索的路径查找器)。
基本上,我的对象如下所示:
public struct Tile
{
public int id;
public int x;
public int y;
public int cost;
public bool walkable;
public int distanceLeft;
public int parentid;
}
我想得到距离Left最小的项目。列表声明如下:
List<Structs.Tile> openList = new List<Structs.Tile>();
并以这种方式分配值:
while (pathFound == null)
{
foreach (Structs.Tile tile in map)
{
foreach (Structs.Tile tile1 in getSurroundingTiles(Current))
{
if (tile1.x == tile.x && tile1.y == tile.y)
{
Structs.Tile curTile = tile1;
curTile.parentid = Current.id;
curTile.distanceLeft = (Math.Abs(tile.x - goalx) + Math.Abs(tile.y - goaly));
if (curTile.distanceLeft == 0)
{
pathFound = true;
}
openList.Add(curTile);
}
}
}
foreach (Structs.Tile tile in openList)
{
}
}
如果我不得不猜测,我会说这要么非常困难,要么比我说的要复杂得多,或者非常简单,我只是感到困惑。
我确实考虑过滚动列表并将每个项目与其较低的对应项进行比较,但考虑到我们所处的时代,这似乎不合理,似乎会有更简单的方法。我不关心列表的顺序,因为我为每个项目分配了一个索引,我可以从中调用它。
提前致谢!
【问题讨论】:
-
你应该看看 LINQ。
-
为什么要使用结构体?它确实消耗了大约 28 个字节,这比 4/8 字节的指针大小要大得多。每个确实使用您的结构的方法都需要携带 28 个字节。如果是类,则比较会快得多。
-
这可能是重复的 mbeckish,但我对 Linq 的了解还不够,无法知道这是一个 Linq 函数,所以对此我深表歉意。不过,我仍然想保留此线程一段时间,因为它确实包含我认为可能对某些人有用的响应(其他可能不知道 Linq 或此处引用的关联的人)。
-
Alois Kraus - 我并不完全了解使用类的优缺点,尽管我认为声明类的新实例比新实例更重要一个结构?如果没有,请告诉我,我会记住这一点以供将来参考。非常感谢您的建议,非常感谢!
-
有一篇小文章解释了这个东西:msdn.microsoft.com/en-us/magazine/cc301569.aspx
标签: c# algorithm search a-star