Вывод коллекции

386
10 августа 2017, 20:56

Есть массив и список такого же типа. В цикле я изменяю массив и после каждого изменения добавляю его в список (по окончанию цикла хочу получить список из всех массивов которые получились в результате изменений). Но при выводе списка все его элементы одинаковы, аналогичны последнему добавленному в список массиву. Почему это происходит?

        byte[,] mat = new byte[3, 3];
        List<byte[,]> list = new List<byte[,]>();
        for (int m = 0; m < 9; ++m)
        {
            byte i = 0;
            byte j = 0;
            // Поиск пустой ячейки (нулевой)
            bool flag = false;
            for (i = 0; i < 3; ++i)
            {
                for (j = 0; j < 3; ++j)
                    if (mat[i, j] == 0)
                    {
                        flag = true;
                        break;
                    }
                if (flag) break;
            }
            // Добавление измененного массива в список
            mat[i, j] = 1;
            list.Add(mat);
            // Вывод всех элементов списка
            foreach (byte[,] a in list)
            {
                PrintMatrix(a);
            }
        }
Answer 1

Все дело в том, что массивы - это ссылочный тип данных.
Вот что это значит в контексте вашей задачи: ваш список состоит не из одинаковых объектов, а из одного объекта. Как так получилось? Ответ :

  1. Вы присвоили ссылке mat объект
  2. Изменили объект на который указывает ссылка mat
  3. Добавили ссылку на этот объект в список
  4. изменили объект на который указывает ссылка mat, то есть вы изменили тот объект который был уже добавлен в коллекцию
  5. Добавили ссылку на этот объект в список(на тот самый многострадальный объект)

    После выполнения этих действий мы имеем что mat, list[0], list[1] указывают на один и тот же объект в управляемой куче. Для решения проблемы достаточно заменить list.Add(mat); на list.Add((byte[,])mat.Clone()); но такое решение можно использовать только с массивами типов значений.
READ ALSO
Обмен данными между приложениями

Обмен данными между приложениями

Нужно передавать данные между приложениями на одном компьютереИспользую такой код:

492
Служба windows С#

Служба windows С#

Есть приложение написанное на C#, все параметры приложения прописаны в configini

359