Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше изменить размер динамического массива? 
:(
    Опции темы
mastermedia
Дата 3.1.2012, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 31.10.2010

Репутация: нет
Всего: нет



В Шилдте в для закрепления теория по индексаторам и свойствам рекомендуют в качестве упражения создать класс динамический массив. Но у меня возник вопрос, как лучше изменять размер массива - распределять память в свойстве Length массива или использовать отдельный метод, который будет вызыватся в свойстве Length и распределять память под другой размер массив. Возможно оба способа плохие, вы можете подсказать как лучше всего сделать. Вот как я реализовал это с помощью отдельного метода.

Класс DynamicArray
Код

class DynamicArray
    {
        private int[] a;
        private int len;

        public DynamicArray(int size)
        {
            a = new int[size];
            len = size;
        }

        public bool Error { get; private set; }
        public int Length
        {
            get
            {
                if (len < 0)
                {
                    Console.WriteLine("Длина массива меньше 0");
                    Error = true;
                    return 0;
                }

                else
                {
                    Error = false;
                    return len;
                }
            }

            set
            {
                if (len < 0)
                {
                    Error = true;
                }

                else
                {
                    Error = false;
                    len = value;
                    ReSize(len);
                }
            }
        }

        public int this[int index]
        {
            get
            {
                if (ok(index))
                {
                    Error = false;
                    return a[index];
                }

                else
                {
                    Error = true;
                    return 0;
                }
            }

            set
            {
                if (ok(index))
                {
                    Error = false;
                    a[index] = value;
                }

                else
                {
                    Error = true;
                }
            }
        }

        private bool ok(int p)
        {
            if (p >= 0 && p < len)
            {
                return true;
            }

            else
            {
                return false;
            }
        }

        private void ReSize(int size)
        {
            a = new int[size];
        }
    }

Класс DynamicArrayDemo
Код

    class DynamicArrayDemo
    {
        static void Main()
        {
            DynamicArray array = new DynamicArray(10);
            Random r = new Random();
            //int size = 0;
            Console.WriteLine("Длина массива до изменения: " + array.Length);
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = r.Next(1, 10);
            }

            Console.Write("Элементы массива: ");
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write(array[i] + " ");
            }

            Console.WriteLine("\n");
            Console.WriteLine("Изменим размер массива.");
            Console.Write("Введите значение с клавиатуры: ");
            array.Length = Convert.ToInt32(Console.ReadLine());
            //size = array.Length;
            Console.WriteLine("\n");
            Console.WriteLine("Длина массива после изменения: " + array.Length);
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = r.Next(1, 12);
            }

            Console.Write("Элементы массива: ");
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write(array[i] + " ");
            }
            Console.WriteLine();
        }
    }


Вот как выглядит код с распределением памяти для массива в свойстве Length. Метод ReSize отсутсвует.
Код

public int Length
        {
            get
            {
                if (len < 0)
                {
                    Console.WriteLine("Длина массива меньше 0");
                    Error = true;
                    return 0;
                }

                else
                {
                    Error = false;
                    return len;
                }
            }

            set
            {
                if (len < 0)
                {
                    Error = true;
                }

                else
                {
                    Error = false;
                    len = value;
                    a = new int[len];
                }
            }
        }

PM MAIL   Вверх
Voyager
Дата 5.1.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



В Length лучше оставить только get, а для изменения размера сделать метод SetLength. Такой способ будет лучше в практических разработках.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.