Почему $ ReturnValue1 генерируется, когда я передаю (по значению) словарь <char, stack <int>> в функцию - PullRequest
0 голосов
/ 28 мая 2019

Мы создаем игру Towers of Hanoi в окне консоли. Мы должны использовать словарь> для хранения игровых фигур. Я объявил это вне основного как глобальное. Когда я звоню static void function drawboard(Dictionary<char, Stack<int>>. Независимо от того, что я пытаюсь, имя локальной переменной System.Collections.Generic.Dictionary<TKey, TValue>.this[TKey].get returned. Когда я смотрю переменную, она отображается как $ReturnValue1, и она перезаписывает мой оригинальный словарь. Что происходит и как мне это остановить или хотя бы обойти.

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

- декларация -

 static Dictionary<char, Stack<int>> towers = new Dictionary<char, Stack<int>>();
            towers.Add('A', new Stack<int> { });
            for (int x = 4; x > 0; x--)
            {
                towers['A'].Push(x);
            } 
            towers.Add('B', new Stack<int> { }); 
            towers.Add('C', new Stack<int> { });

--- функция рисования доски ---

static void printboard(Dictionary<char, Stack<int>> t)
    { 
        Stack<int> A = t['A'];
        Stack<int> B = t['B'];
        Stack<int> C = t['C'];


        for (int y = 0; y < 5; y++)
        {
            if (y == 4)
            {
                Console.Write("----------\n" +
                              "A   B   C\n");
            }
            else
            {
                if (A.Count == 0)
                    Console.Write("|" + "   ");
                else
                {
                    Console.Write(A.Pop() + "   ");
                }
                if (B.Count == 0)
                    Console.Write("|" + "   ");
                else
                {
                    Console.Write(B.Pop() + "   ");
                }
                if (C.Count == 0)
                    Console.Write("|" + "   ");
                else
                {
                    Console.Write(C.Pop() + "   ");
                }
                Console.Write("\n");
            }
        }
    }

Код должен передавать словарь по значению, извлекать значения из локальной копии словаря и распечатывать их в окне консоли, не затрагивая исходный словарь Towers.

1 Ответ

0 голосов
/ 28 мая 2019

Создайте переменную типа Dictionary и присвойте ей копию исходного словаря towers, а затем передайте эту новую переменную в метод printboard.Примерно так:

var copiedTowers = new Dictionary<char, Stack<int>>(towers);
printboard(copiedTowers);

Это также может быть реализовано следующим образом:

printboard(new Dictionary<char, Stack<int>>(towers));

Также в методе printboard при инициализации переменной Stack<int> A следует тот же подходскопировать содержимое словарного значения.Как это:

Stack<int> A = new Stack<int>(t['A']);
Stack<int> B = new Stack<int>(t['B']);
Stack<int> C = new Stack<int>(t['C']);
...