Циклы IEnumerable - PullRequest
       1

Циклы IEnumerable

1 голос
/ 26 декабря 2010

Как получить определенный индекс или цикл через эту структуру данных?

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 *.Я хочу сделать 2 вещи с этой структурой данных:

  1. Создать график (добавить узлы и их дочерние элементы)
  2. Уметь проходить по нему, находить узел и получать его конкретный индексвроде: Path<Vector2> node; тогда сможете сделать node[0].

1 Ответ

2 голосов
/ 26 декабря 2010

Ну, вы можете пройти через него просто с помощью цикла foreach:

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

По общему признанию, это выглядит так, как будто это будет повторяться в обратном порядке - если вы хотите повернуть его вспять, вы можете просто использовать LINQ, как это:

foreach (Vector2 node in path.Reverse())

Вы можете сделать это, потому что вы реализовали IEnumerable<T>.Получить доступ к нему по индексу довольно сложно ... насколько я могу судить, вы не сможете сделать это особенно эффективным способом.

Опять же, вы можете использовать LINQ, чтобы подделать его- но это будет просто перебирать узлы, пока не достигнет нужного элемента:

Vector2 node = path.ElementAt(2); // Or whatever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...