Динамический массив объектов C#

119
21 декабря 2021, 16:40

Есть свой класс (public class MyNum). Как объявить, а потом инициализировать двумерный динамический массив, с объектами моего класса?

Как ни пробую, ошибки. Как делаю:

public MyNum [][] Array1= new MyNum[2][];

Далее пытаюсь так:

Array1[0][0]=new MyNum(arg1);

Естественно получаю крит, потому что под элемент массива Array[0][0] не выделена память. Казалось бы Всё должно облегчить Array1[0].Append()

Но так тоже не работает.

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

Доп вопрос В чем разница между объявлениями:

public MyNum[,] Array1; 
public MyNum[][] Array1; 

не понимаю и нигде об этом не написано. Как обычно!!!

Answer 1

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

List является враппером (оберткой) вокруг Array. В джаве и некоторых других языках это называется ArrayList, что более соответствует тому, чем он является на самом деле. При желании ты можешь загуглить как именно он устроен.

Что именно тебе нужно - это создать лист листов.

var list = List<List<MyNum>>();

тогда же ты можешь использовать его так как тебе нужно.

list.add( new List<MyNum>() ); // добавляем строку
list[0].add( new MyNum(2) );   // добавляем ячейку в строку

и обращаться к нужной ячейке после этого

var myNum = list[0][0];

Использование же именно массивов для данного случая является нежелательным т.к. функция аппенд() по-факту является пересозданием массива в новой области памяти с размером на +1 ячейку с последующим копированием данных. Так что эта операция достаточно дорогостоящая по ресурсам и ее нужно избегать.

Конкретно массивы нужно использовать исключительно в том случае, если тебе наперед известно сколько именно элементов будет записано и их количество изменятся не будет.

Если же хочется использовать именно массив, то нужно сделать тот же подход что я сделал с листом. Сначала аппендить "строку под ячейки", а лишь потом уже аппендить ячейку в строку.

Answer 2

При выполнении данного кода

public MyNum [][] Array1= new MyNum[2][];

в Array1 будет два элемента null. Именно поэтому при попытке обратиться к Array1[0][0] происходит ошибка.

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

Array1[0] = new MyNum[2]();

Тогда строчка Array1[0][0]=new MyNum(arg1); уже не будет давать ошибку.

Также можно сразу инициализировать массив, например:

new MyNum[2][] { new[] { new MyNum() }, new[] { new MyNum() } };

Если количество заранее неизвестно, либо может изменяться в процессе выполнения, можно воспользоваться List<T>. В нем присутствует операция Add для добавления новых элементов.

READ ALSO
Вылетает с ошибкой что делать? [закрыт]

Вылетает с ошибкой что делать? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

154
Как сделать TextBox растягивающимся?

Как сделать TextBox растягивающимся?

используюNet Framework (compact Edition) для мобильного приложения

166
Перевод формата даты Excel в python datetime формат

Перевод формата даты Excel в python datetime формат

Работаю над задачей перевода формата даты ячейки Excel-я в python datetime форматНашел на английском stackoverflow подходящую реализацию перевода C# формата...

141