如何在同一条火车线上获得方向?

How to get a direction on the same train line?

你能帮我一步一步地解释我需要在同一条火车线上找到方向的逻辑吗?已经拥有具有 Next 和 Previous 功能的公共火车线路。

public IStation Next(IStation s)
{
    if (!_stations.Contains(s))
    {
        throw new ArgumentException();
    }
    var index = _stations.IndexOf(s);
    var isLast = index == _stations.Count -1;
    if (isLast)
    {
        return null;
    }
    return _stations[index + 1];
}

public IStation Previous(IStation s)
{
    if (!_stations.Contains(s))
    {
        throw new ArgumentException();
    }
    var index = _stations.IndexOf(s);
    var isFirst = index == 0;
    if (isFirst)
    {
        return null;
    }
    return _stations[index - 1];
}

还有我寻找方向的功能。

public string GetLineDirectiom(Station from, Station to, Line commonLine)
{
    bool fromNextTo = true;


    //to.Lines.Count();
    //to.ToString();
    var Final = commonLine.Next(from);
    while (Final != null)
    {

    }

    if (fromNextTo)
        return "next";
    else return "previous";
}

不清楚你想做什么以及为什么要返回字符串 "next" 和 "prev" 作为方向,但一般来说要通过两个站获取方向:

    public int GetStationIndex(IStation s)
    {
        var index = _stations.IndexOf(s);
        if (index == -1)
        {
           throw new ArgumentException();
        }

        return index ;
    }


    public string GetLineDirection(Station from, Station to, Line commonLine)
    {
       var direction = commonLine.GetStationIndex(from)<commonLine.GetStationIndex(to)?"next" : "previous" 
       return direction;
    }

您似乎正尝试 "visit the stations along commonLine",从 from 站开始。

你开始的循环是一个有效的开始;您需要一个变量来存储您当前访问的站点。可能这里的当前变量名Final有点把自己弄糊涂了,因为它不是线路的"final"站,只是你当前访问的站

因此,让我们将变量命名为currentStation。然后,您想去下一站,直到找到 to(从而知道方向),或者直到到达终点:

var currentStation = from;
while (currentStation != null)
{
    if (currentStation == to)
    {
        return "next";
    }
    currentStation = commonLine.Next(currentStation);
}

现在,这将检查 to 是否为 "ahead"。如果不是,您可以继续检查是否可以在另一个方向找到它,再次从 from:

开始
currentStation = from;
while (currentStation != null)
{
    if (currentStation == to)
    {
        return "previous";
    }
    currentStation = commonLine.Previous(currentStation);
}

如果这个循环也没有找到to,显然to不在线。根据您的喜好处理此案例。

一些备注:

  • 将方向指示为 "next" 或 "previous" 可能有点误导。如果它确实是直线的方向,请考虑像 "forward" 和 "backward" 这样的东西,因为 "next" 和 "previous" 确实暗示了直接的 next/previous 元素列表。
  • 虽然上述工作正常,但我确实注意到您的 Line 对象已经在索引列表中包含站点。因此,实现目标的更简单方法可能是仅确定 commonLine 上的 fromto 站的索引,然后比较哪个大于另一个。