Есть ли способ упростить эту функцию?

У меня есть функция, которая возвращает строку с координатами и направлением, на которое смотрит объект. Но мне очень не нравится длина функции, и я хотел бы ее сократить. Я не знаю, что я мог бы сделать, чтобы сократить его. Кто-нибудь может мне помочь?

Функция выглядит так:

public string Execute(string text)
{
    var letters = text.ToCharArray().ToList();

    foreach (var letter in letters)
    {
        if (letter == 'R')
        {
            switch(direction)
            {
                case "N":
                    direction = "E";
                    break;
                case "E":
                    direction = "S";
                    break;
                case "S":
                    direction = "W";
                    break;
                case "W":
                    direction = "N";
                    break;
            }
        }

        if (letter == 'L')
        {
            switch (direction)
            {
                case "N":
                    direction = "W";
                    break;
                case "E":
                    direction = "N";
                    break;
                case "S":
                    direction = "E";
                    break;
                case "W":
                    direction = "S";
                    break;
            }
        }

        if (letter == 'M')
        {
            switch (direction)
            {
                case "N":
                    positionY++;
                    break;
                case "E":
                    positionX++;
                    break;
                case "S":
                    positionY--;
                    break;
                case "W":
                    positionX--;
                    break;
            }
        }
            
        if (letter == 'B')
        {
            switch (direction)
            {
                case "N":
                    positionY--;
                    break;
                case "E":
                    positionX--;
                    break;
                case "S":
                    positionY++;
                    break;
                case "W":
                    positionX++;
                    break;
            }
        }
    }

    return $"{positionX}:{positionY}:{direction}";
}

Этот текст внизу - просто бесполезный текст, поэтому я могу отправить свой вопрос, потому что мой код слишком длинный, а Stackoverflow распознает вопрос как в основном код, поэтому мне нужно написать больше текста без кодовых скобок, чтобы иметь возможность отправить вопрос. Вам не нужно читать этот Текст, потому что он не имеет цели.


person Luegu    schedule 25.03.2021    source источник
comment
Ищите закономерности и придумывайте способ их использования в алгоритме. Например, для R и L похоже, что прямое вращение вращается либо по часовой стрелке, либо против часовой стрелки. Вы можете написать небольшую функцию, которая позволяет это (с массивом строк направления (которые вы делаете циклическим) и что ваш код перемещается влево или вправо в массиве). Точно так же для M и B вы смещаете позиции либо на +1, либо на -1 по фиксированному шаблону. Преобразуйте эту логику в функцию, которая вычисляет правило.   -  person Flydog57    schedule 25.03.2021
comment
Используйте словари со старым значением в качестве ключа и новым значением в качестве значения. Dictionary‹string, string› lDict = new Dictionary‹string, string›() { { N, W }, { E, N }, { S, E }, { W, S } }; Дикт = lDict[дикт];   -  person jdweng    schedule 25.03.2021
comment
На мой взгляд, это совершенно правильный подход. Хотя это может быть еще несколько строк кода, чем умные решения, его проще всего поддерживать и понимать. Для любого другого решения, предложенного здесь до сих пор, вам будет трудно, если вам или кому-то еще придется изменить его позже. Вместо этого все сразу поймут простой подход к переключению.   -  person Heinz Kessler    schedule 25.03.2021


Ответы (1)


Попробуйте следующее:

           string text = "";
            var letters = text.ToCharArray().ToList();
            Dictionary<char, Dictionary<string, string>> dict = new Dictionary<char, Dictionary<string, string>>() {
                {'R', new Dictionary<string, string>() { { "N", "E" }, { "E", "S" }, { "S", "W" }, { "W", "N" }}},
                {'L', new Dictionary<string, string>() { { "N", "W" }, { "E", "N" }, { "S", "E" }, { "W", "S" }}},
                {'M', new Dictionary<string, string>() { { "N", "AY" }, { "E", "AX" }, { "S", "SY" }, { "W", "SX" }}},
                {'R', new Dictionary<string, string>() { { "N", "SY" }, { "E", "SX" }, { "N", "AY" }, { "N", "AX" }}}
            };
            string direction = "";
            int positionX = 0;
            int positionY = 0;

            foreach (var letter in letters)
            {
                string value = dict[letter][direction];
                switch (value)
                {
                    case "SX":
                        positionX--;
                        break;
                    case "SY":
                        positionY--;
                        break;
                    case "AX":
                        positionX++;
                        break;
                    case "AY":
                        positionY++;
                        break;
                    case "N":
                        direction = value;
                        break;
                    case "E":
                        direction = value;
                        break;
                    case "S":
                        direction = value;
                        break;
                    case "W":
                        direction = value;
                        break;
                }
person jdweng    schedule 25.03.2021