Сравнение двух списков с одним списком, являющимся пользовательским вводом, всегда вызывает флаг - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать приложение для Windows Form для практики с очень простыми правилами.Создается случайный набор букв, и пользователь пытается набрать его до истечения времени.Я сталкиваюсь с проблемой, когда я сравниваю два списка.Это всегда вызывает мой GameOver bool, даже когда я удостоверяюсь, что я напечатал то же самое.

public static void CheckGameOver()
    {
        if (code != Player.inputList)
        {
            GameOver = true;
        }
    }

private void button1_Click(object sender, EventArgs e)
    {
        timeLeft.Stop();
        Player.inputList = userText.Text.ToList();
        Game.CheckGameOver();
        if (Game.GameOver == true)
        {
            this.Close();
            GameOverByInput gameOverByInput = new GameOverByInput();
            gameOverByInput.Show();
        }
        else if (Game.GameOver == false && Game.Level < 16)
        {
            this.Close();
            Game.WinRound();
            InbetweenLevels inbetweenLevels = new InbetweenLevels();
            inbetweenLevels.Show();
        }
        else
        {
            this.Hide();
        }
    }

Я думаю, моё понимание Player.inputList = userText.Text.ToList(); может быть ошибочным, и это является причиной проблемы.Если потребуется дополнительная информация, я предоставлю ее.

1 Ответ

1 голос
/ 20 июня 2019

Если вы сравниваете два списка, в то время как они оба могут иметь одинаковые элементы , вы сравниваете две отдельные ссылки в своем коде.

Это означает, что они различны и, таким образом, ваше условие для установки флага GameOver в true выполнено .

У вас есть много вариантов для сравнения, которое лучше соответствует тому, что вы ищете.

  1. Вы можете сравнить, что списки имеют одинаковое количество членов , и после этого итерируйте и сравните элементы каждого списка по индексу , что означает, что вы сравниваете первый элемент списка кодов с первым элементом Player.inputList и т. д. Если вы перебираете все элементы и условие выполняется, тогда списки содержат одинаковую информацию и, таким образом, можно считать тем же списком . (Вы также можете использовать Enumerable.SequenceEqual для достижения того же поведения)

  2. Вместо использования списков для хранения значений, используйте строки как для переменной кода, так и для player.inputList , а затем сравните эти две строки, как при сравнении строк (либо через ==, либо метод .Equals) сравнение будет оценивать, если каждая строка содержит одну и ту же информацию (тип ссылки на строку был написан для выполнения этого сравнения вместо оценки, если каждая строка указывает на одну и ту же ссылку), если вы сравниваете строку с другой строкой и они содержат одинаковый текст или символы, сравнение вернет true, чтобы показать, что строки равны .

Это только вершина айсберга, у вас есть много других способов проверить равенство, я рекомендую вам поискать dotnetperls и прочитать каждую статью, которая у вас есть, что может помочь вам лучше понять, почему ваше сравнение не работает так, как вы ожидаете это к.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...