如何获取特定索引或遍历此数据结构?
public class Path<TNode> : IEnumerable<TNode>
{
public TNode LastStep { get; private set; }
public Path<TNode> PreviousSteps { get; private set; }
public double TotalCost { get; private set; }
private Path(TNode lastStep, Path<TNode> previousSteps, double totalCost)
{
LastStep = lastStep;
PreviousSteps = previousSteps;
TotalCost = totalCost;
}
public Path(TNode start) : this(start, null, 0) { }
public Path<TNode> AddStep(TNode step, double stepCost)
{
return new Path<TNode>(step, this, TotalCost + stepCost);
}
public IEnumerator<TNode> GetEnumerator()
{
for (Path<TNode> p = this; p != null; p = p.PreviousSteps)
yield return p.LastStep;
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
它用作 A* 算法的图形。我想用这个数据结构做两件事:
- 生成图(添加节点及其子节点)
- 能够遍历它并找到一个节点并获取其特定索引,如:
Path<Vector2> node;
然后可以做node[0]
.
最佳答案
好吧,您可以使用 foreach 循环遍历它:
foreach (Vector2 node in path)
{
...
}
不可否认,这看起来会以相反的顺序迭代 - 如果您想反转它,您可以像这样使用 LINQ:
foreach (Vector2 node in path.Reverse())
您可以这样做,因为您已经实现了 IEnumerable<T>
.能够通过索引访问它是相当棘手的……据我所知,您将无法以特别有效的方式做到这一点。
同样,您可以使用 LINQ 来伪造它 - 但这只会遍历节点,直到它到达正确的元素:
Vector2 node = path.ElementAt(2); // Or whatever
关于c# - 循环 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4535297/