Как несколько раз записать в List массив с одним и тем же именем но разными значениями?

Здравствуйте.

Я пытаюсь записывать одномерный массив в List несколько раз.
List<object[]> arrList = new List<object[]>();
object[] anyArr = new object[5];

for (int i = 0; i < 6; i++)
{
    anyArr - каждую итерацию цикла for содержание одномерного массива меняется. 

    arrList.Add(anyArr);
}

При этом каждый раз я изменяю содержание одномерного массива anyArr.
Проблема в том, что в итоге я получаю List содержащий 6 (так как цикл for считает до 6-ти) раз продублированный массив, который был на последней итерации цикла for.
  • Вопрос задан
  • 256 просмотров
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C#
Конечно у вас будет один и тот же массив, вы ведь его один раз создали снаружи цикла.

В C# массив - ссылочный тип. Это значит что ваша переменная anyArr хранит в качестве значения ссылку (!) на массив. Если вы скопируете значение переменной, что вы по сути делаете в строке arrList.Add(anyArr); вы скопируете эту самую ссылку на массив, но не сам массив (в результате ссылка на один и тот же массив будет помещена в список 6 раз).

Если хотите иметь 6 разных массивов - создавайте их в цикле, или копируйте исходный, смотря что вам нужно делать. В любом случае, вам нужно 6 разных объектов типа object[] .

Затем читайте про типы-значения и типы-ссылки в C#.
Ответ написан
arrList это список ссылок на другие списки, т.е. когда вы делаете arrList.Add(anyArr);, то вы добавляете в общем список ссылку на другой список. Поскольку вы создали его всего однажды, то вы добавляете всегда одну и туже ссылку, которая ведет на один и тот же участок памяти. Редактируя эту память, вы одновремено изменяете все списки в общем списке. Сделать как вы хотите можно так:
List<object[]> arrList = new List<object[]>();
object[] anyArr = new object[5];

for (int i = 0; i < 6; i++)
{
    anyArr - каждую итерацию цикла for содержание одномерного массива меняется. 

    arrList.Add(anyArr.ToArray());
}

При arrList.Add(anyArr.ToArray()); будет создаваться новый список и уже ссылка на него будет добавляться в общий список.

UPD. Зменил ToList на ToArray
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы