Как получить направление на той же линии поезда? - PullRequest
0 голосов
/ 21 января 2020

Можете ли вы помочь мне с пошаговой логикой c, что мне нужно, чтобы получить направление на той же линии поезда. с уже имеющейся общей железнодорожной линией с функциями 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";
}

Ответы [ 2 ]

1 голос
/ 21 января 2020

Похоже, вы пытаетесь "посетить станции вдоль commonLine", начиная со станции from.

Запущенный вами l oop является действительным началом с этой целью; вам нужна переменная для хранения станции, которую вы сейчас посещаете. Возможно, текущее имя переменной Final немного смущает вас, потому что это не «конечная» станция линии, а та, которую вы сейчас посещаете.

Поэтому давайте назовем переменную currentStation. Затем вы хотите go перейти к следующей станции, пока не найдете to (и, следовательно, не узнаете направление), или пока не достигнете конца линии:

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

Теперь это проверяет, является ли to «впереди». Если это не так, вы можете приступить к проверке, можно ли его найти в другом направлении, снова начиная с from:

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

Если этот l oop не находит to либо, очевидно, to не на линии. Относитесь к этому случаю в соответствии со своими предпочтениями.

Некоторые замечания:

  • Указание направления как «следующий» или «предыдущий» может быть немного вводящим в заблуждение. Если это действительно направление линии, подумайте о чем-то вроде «вперед» и «назад», так как «следующий» и «предыдущий» действительно подразумевают прямые следующие / предыдущие элементы в списке.
  • В то время как выше работает, я отмечаю, что ваш Line объект уже имеет станции в индексированном списке. Поэтому более простым способом достижения вашей цели может быть просто определить индексы станций from и to на commonLine и сравнить, какая из них больше другой.
0 голосов
/ 21 января 2020

Непонятно, что вы хотите сделать и почему вы возвращаете строки "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;
    }
...