循环IEnumerable

时间:2010-12-26 20:32:35

标签: c# algorithm data-structures

如何通过此数据结构获取特定索引或循环?

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 *算法的图形。我想用这个数据结构做两件事:

  1. 生成图表(添加节点及其子节点)
  2. 能够遍历它并找到一个节点并获得其特定索引,如:Path<Vector2> node;然后能够node[0]

1 个答案:

答案 0 :(得分:2)

你可以使用foreach循环遍历它:

foreach (Vector2 node in path)
{
    ...
}

不可否认,这看起来会以相反的顺序迭代 - 如果你想要反转它,你可以像这样使用LINQ:

foreach (Vector2 node in path.Reverse())

您可以这样做,因为您已实施IEnumerable<T>。能够通过索引访问它是相当棘手的......就我所知,你将无法以一种特别有效的方式做到这一点。

同样,您可以使用LINQ伪造它 - 但这只会迭代节点,直到它到达正确的元素:

Vector2 node = path.ElementAt(2); // Or whatever