Всем привет! Помогите пожалуйста разобраться. У меня класс Laptop и есть класс Shop, в котором есть поле Laptop[] _arr. Не пойму, как реализовать метод добавления/удаления ноутбука в массив. Я попытался сделать через список, но при выводе на экран пустота.
Использовать List<Laptop>
вместо массива.
Предположим, есть некоторый интернет-магазин, который
занимается реализацией ноутбуков. У нас есть классы Shop и
Laptop. У класса Laptop переопределить метод ToString(), чтобы он
возвращал информацию о ноутбуке. В классе Shop должен
храниться массив объектов Laptop. Нужно сделать возможным
обращение к элементам этого массива через экземпляр класса
Shop, пользуясь синтаксисом массива так, словно класс Shop и есть
массив элементов типа Laptop. Добавьте необходимый индексатор,
а также необходимые конструкторы для работы.
Вот условие, мне кажется, что тут нельзя использовать список. Вроде написано массив. В том то и проблема
Наверное, надо отталкиваться от
Может тут и не надо менять, просто передать в конструктор и всё.
Ну или если надо, то создавать новый массив как в аналогичных предыдущих задачах по С++, оно даже старые элементы само скопирует (только при удалении не из конца придется самому копировать). https://docs.microsoft.com/en-us/dotnet/api/system.array.resize
С первой частью разобрался вроде, но хотел спросить, почему, если я делаю так:
Shop a = new Shop(10) { Title = "MyShop" };
Console.WriteLine(a.Title);
a.AddLaptop(new Laptop("Acer", 550, "AMD", 8));
a.AddLaptop(new Laptop("MacBook", 1200, "Intel", 16));
a.AddLaptop(new Laptop("Asus", 500, "Intel", 4));
a.AddLaptop(new Laptop("Asus", 700, "Intel", 8));
a.AddLaptop(new Laptop("Dell", 800, "Intel", 8));
a.AddLaptop(new Laptop("Asus", 500, "Intel", 8));
a.AddLaptop(new Laptop("Asus", 500, "Intel", 8));
a.AddLaptop(new Laptop("Asus", 500, "Intel", 8));
a.AddLaptop(new Laptop("Asus", 500, "Intel", 8));
a.AddLaptop(new Laptop("Asus", 500, "Intel", 8));
a.AddLaptop(new Laptop("Asus", 500, "Intel", 8));
foreach (var laptop in a)
{
Console.WriteLine(laptop.ToString());
}
то все нормально выводится, а если сначала создаю объект класса Laptop, а потом его добавляю, то ничего не выводится?
Вряд ли в этом дело.
Думал что все хорошо, но сделал еще одну проверку и понял, что не то. Если я пытаюсь добавлять после удаления программа вылетает. Вот мои методы добавления/удаления:
public void AddLaptop(Laptop value)
{
if (size == 0)
_arr = new Laptop[1];
else
{
Laptop[] tmp = new Laptop[_arr.Length + 1];
for (int i = 0; i < size; ++i)
{
tmp[i] = _arr[i];
}
_arr = tmp;
}
_arr[size] = value;
size++;
}
public void DelLaptop(int pos)
{
Laptop[] newArr = new Laptop[_arr.Length - 1];
for (int i = 0; i < pos; i++)
{
newArr[i] = _arr[i];
}
for (int i = pos; i < newArr.Length; i++)
{
newArr[i] = _arr[i + 1];
}
_arr = newArr;
}
Объясните, что не так пожалуйста?
Уже нашел в чем дело. Надо было просто сюда написать наверно
Это называется метод утенка
В Add можно не копировать самому.
If
newSize
is greater than the Length of the old array, a new array is allocated and all the elements are copied from the old array to the new one. IfnewSize
is less than the Length of the old array, a new array is allocated and elements are copied from the old array to the new one until the new one is filled; the rest of the elements in the old array are ignored. IfnewSize
is equal to the Length of the old array, this method does nothing.
… но думаю тут все-таки вообще не нужно добавление и удаление.
потому что цель же сделать
а в массиве нет такого.
Ну и это явно намекает