c# - 循环 IEnumerable

标签 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] .

最佳答案

好吧,您可以使用 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/

相关文章:

c# - 如何创建批处理文件来备份Mysql数据库?

c# - 是.GetAwaiter().GetResult();一般用途安全吗?

c# - 强类型 ActionLink 的注意事项

algorithm - 所有的蛮力算法都是指数级的吗?

algorithm - 采访问题: Detecting a fighting game moveset

c# - 如何从包含 5000 条记录的 Excel 文件插入到 documentDB?

algorithm - 计算一组点的哈希码的最佳方法是什么?

javascript - Angular 将相同的成功和错误函数体应用于不同的 $http 请求

java - 如何从双循环处理转换为更好的处理方式?

algorithm - 找出哪个 token 属于哪个 AST 节点