C# странное поведение в цикле foreach - PullRequest
7 голосов
/ 31 марта 2020

После дня устранения неполадок мне удалось сжать проблему до крошечного фрагмента кода. Может ли кто-нибудь объяснить мне, почему это не работает? Я ожидаю, что [рынки] будут 0 2 4 6, [город] [графство] и [улицы] будут 0 1 2 3, когда отображается окно сообщения.

        private void pieceoftestcode()
        {
            string[] county = new string[4];
            string[] city = new string[4];
            string[] markets = new string[4];
            string[] streets = new string[4];
            string[] items = new string[4] { "apple", "banana", "pineapple", "juice" };
            string[] value = new string[4];
            foreach (string item in items)
            {
                for (int i = 0; i <= 3; i++)
                {
                    if (item == "apple")
                        value[i] = (2 * i).ToString();
                    else
                        value[i] = i.ToString();
                }

                if (item == "apple")
                    markets = value;
                else if (item == "banana")
                    streets = value;
                else if (item == "pineapple")
                    county = value;
                else
                    city = value;
            }
            MessageBox.Show("test");
        }

Я перебираю элементы в foreach l oop. Если элемент «яблоко», то я ожидаю, что [значение] будет 0 2 4 6. Первоначально [рынки] назначены 0 2 4 6. Однако, если я выполняю код шаг за шагом, то получается, что во второй раз foreachl oop выполняется, [market] перезаписывается. Это почему? Что я здесь не так делаю? [market] не следует присвоить значение во второй раз, когда банан ударил правильно?

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Вы постепенно получаете все переменные, ссылающиеся на один и тот же массив (value), с любыми значениями, записанными в этот массив в ходе последней установленной итерации.

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

    private void pieceoftestcode()
    {
        string[] county = new string[4];
        string[] city = new string[4];
        string[] markets = new string[4];
        string[] streets = new string[4];
        string[] items = new string[4] { "apple", "banana", "pineapple", "juice" };
        string[] value;
        foreach (string item in items)
        {
            if (item == "apple")
                value = markets;
            else if (item == "banana")
                value = streets;
            else if (item == "pineapple")
                value = county;
            else
                value = city;
            for (int i = 0; i <= 3; i++)
            {
                if (item == "apple")
                    value[i] = (2 * i).ToString();
                else
                    value[i] = i.ToString();
            }


        }
        MessageBox.Show("test");
    }

Теперь каждый раз, когда через l oop value присваивается ссылка на другой массив 1 и поэтому for l oop не перезаписывает свои предыдущие усилия.


1 Предполагая, что items не содержит ни повторяющихся элементов, ни более одного не яблоки, бананы или ананасы.

0 голосов
/ 31 марта 2020

Ваша основная проблема заключается в том, что в операторах

            if (item == "apple")
                markets = value;
            else if (item == "banana")
                streets = value;
            else if (item == "pineapple")
                county = value;
            else
                city = value;

вы не создаете новый массив - вы просто назначаете ссылку на объект. А затем вы меняете свой массив в цикле for ().

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