Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153

Код из ArrayList

12.07.2018, 21:09. Показов 1634. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток. Кто нить сможет обьеснить работу этого кода. я взял из ArrayList метод Add
C#
1
2
3
4
5
6
7
8
9
10
11
12
public virtual int Add(object value)
{
    if (this._size == this._items.Length)
    {
        this.EnsureCapacity(this._size + 1);
    }
    this._items[this._size] = value;
    this._version++;
    int num = this._size;
    this._size = num + 1;
    return num;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.07.2018, 21:09
Ответы с готовыми решениями:

Изменить код с применением ArrayList и SortedList
Сама программа ниже выполняет: Создать абстрактный класс Издание с методами позволяющим вывести на экран информацию об издании, а также...

Поиск в ArrayList ничего не возвращает. Исправить код
есть некоторый список,мне нужно найти в нем данные. Как я понимаю надо просто проверить массив на наличие этого элемента и если есть...

Ошибка при работе с ArrayList (Обнаружен недостижимый код)
Что значит ошибка: Обнаружен недостижимый код? Вылезает на строке (подчеркивает myArrList): myArrList.RemoveAt(0);

17
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.07.2018, 21:35
Цитата Сообщение от Гиоргий Посмотреть сообщение
Кто нить сможет обьеснить работу этого кода.
А что конкретно в нем непонятно?
ArrayList — обычная обертка над массивом, в методе сначала проверяется количество оставшегося в массиве свободного места — если оно закончилось, то создается новый массив большего размера. Этим занимается метод EnsureCapacity.
Дальше в массив записывается новое значение, увеличивается значение верси и количество элементов.
В конце возвращается индекс свежедобавленного элемента.
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
12.07.2018, 21:45  [ТС]
я такой метод сделал при помощи цикла for, создавал временный массив, туда копировал основной, дальше создавал новый массив на один элемент больше. и вот тут как раз и загвоздка, как тут создается новый
Цитата Сообщение от kolorotur Посмотреть сообщение
метод EnsureCapacity.
.
Цитата Сообщение от kolorotur Посмотреть сообщение
Дальше в массив записывается новое значение, увеличивается значение верси и количество элементов.
как конкретно вот это происходит
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.07.2018, 22:46
Цитата Сообщение от Гиоргий Посмотреть сообщение
как конкретно вот это происходит
Так посмотрите реализацию метода EnsureCapacity точно так же, как вы посмотрели реалзацию метода Add.
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
12.07.2018, 22:55  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Так посмотрите реализацию метода EnsureCapacity точно так же, как вы посмотрели реалзацию метода Add.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void EnsureCapacity(int min)
{
    if (this._items.Length < min)
    {
        int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
        if (num > 0x7fefffff)
        {
            num = 0x7fefffff;
        }
        if (num < min)
        {
            num = min;
        }
        this.Capacity = num;
    }
}
можете просто обьеснить по строчно что происходит тут?

Добавлено через 1 минуту
Цитата Сообщение от Гиоргий Посмотреть сообщение
Так посмотрите реализацию метода EnsureCapacity точно так же, как вы посмотрели реалзацию метода Add.
тут не могу просто понять когда создается новый массив как туда основной добавляется
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
12.07.2018, 23:30
Гиоргий, зачем смотреть декомпилятором, если можно посмотреть на исходник с понятными именами констант.
1
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
13.07.2018, 12:53  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
Гиоргий, зачем смотреть декомпилятором, если можно посмотреть на исходник с понятными именами констант
тогда так, вот мной написаный код, и как можно его написать без использования For цикла.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public int Add(object value) {
                     object[] temp = new object[_items.Length];
 
                     int length = _items.Length;
                     for (int i = 0; i < _items.Length; i++) {
                           temp[i] = _items[i];
                     }
             
                     _items = new object[_items.Length + 1];
 
                     for (int i = 0; i < temp.Length; i++) {
                           _items[i] = temp[i];
                     }
 
                     _items[_items.Length - 1] = value;
 
                     return _items.Length - 1;
              }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
13.07.2018, 14:00
Гиоргий, так
C#
1
2
3
4
5
6
7
8
9
public int Add(object value) {
    object[] temp = new object[_items.Length+1];
    Array.Copy(_items, temp, _items.Length);
    
    _items = temp;
    _items[_items.Length - 1] = value;
 
    return _items.Length - 1;
}
или так
C#
1
2
3
4
5
public int Add(object value) {
    Array.Resize(ref _items, _items.Length+1);
    _items[_items.Length - 1] = value;
    return _items.Length - 1;
}
1
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
13.07.2018, 14:18  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Гиоргий, так
загвоздка в том что нельзя использовать встроенные методы ArrayCopy или Resize
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
13.07.2018, 14:22
Лучший ответ Сообщение было отмечено Гиоргий как решение

Решение

Гиоргий, в таком случае используем while, потому что без цикла так или иначе здесь не обойтись.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public int Add(object value) {
    object[] temp = new object[_items.Length+1];
    int i=0;
    while (i < _items.Length) {
        temp[i] = _items[i];
        i++;
    }
    
    _items = temp;
    _items[_items.Length - 1] = value;
 
    return _items.Length - 1;
}
1
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
13.07.2018, 14:30  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Гиоргий, в таком случае используем while, потому что без цикла так или иначе здесь не обойтись.
я постараюсь обьеснить. после написания кода мы сравнили на быстродействие мой код ADD и код из ArrayList.Add. мой очень отставал на быстродействие. и наверно виной этому было то что массив надо было пересчитывать при переносе во временный и потом наоборот назад опять возвращать. а нельзя ли написать так чтобы про увеличении элементов массива скажем на один не приходилось заного его заполнять?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
13.07.2018, 14:41
Гиоргий, Add из ArrayList работает быстрее потому что он создает массив с запасом и создает новый масссив только когда этот массив заполнен до конца. Для этого у него и введены свойства Count (количество элементов) и Capacity (количество элементов которое может поместиться в коллекции без выделения новой памяти). Это видно в коде метода EnsureCapacity который ты уже приводил. В начале Capacity = 0, затем 4, далее удваивается. Сделай по аналогии и получишь похожую скорость.
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
13.07.2018, 14:47  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Гиоргий, Add из ArrayList работает быстрее потому что он создает массив с запасом и создает новый масссив только когда этот массив заполнен до конца. Для этого у него и введены свойства Count (количество элементов) и Capacity (количество элементов которое может поместиться в коллекции без выделения новой памяти). Это видно в коде метода EnsureCapacity который ты уже приводил. В начале Capacity = 0, затем 4, далее удваивается. Сделай по аналогии и получишь похожую скорость.
я это понимаю на счет выделения заранее, но я там не вижу дальше в коде запись во временный массив и потом обратную перезапись. может я что то не понимаю до конца.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
13.07.2018, 14:49
Цитата Сообщение от Гиоргий Посмотреть сообщение
но я там не вижу дальше в коде запись во временный массив и потом обратную перезапись.
там Array.Copy в сеттере свойства Capacity
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
13.07.2018, 14:50
Гиоргий, зачем здесь двойная перезапись? Я же уже показал что достаточно один раз скопировать.
1
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
13.07.2018, 16:22  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
там Array.Copy в сеттере свойства Capacity
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Гиоргий, зачем здесь двойная перезапись? Я же уже показал что достаточно один раз скопировать.
Большое спасибо за помощь!!!!

Добавлено через 1 час 19 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Гиоргий, зачем здесь двойная перезапись? Я же уже показал что достаточно один раз скопировать.
я сейчас понял)))) просто можно было оказывается скопировать temp в items и Items увеличился бы сам. я вот это не знал
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
14.07.2018, 09:41
Гиоргий, когда я писал список, то изначально его емкость равнялась 1, затем 2, 4, 8... Чем больше добавляешь в список тем реже происходит переаллокация и тем быстрее работает программа. Для примера:
C#
1
2
3
4
5
        public void AddLast(T value)
        {
            TryResize();
            content[Count - 1] = value;
        }
а вот TryResize:
C#
1
2
3
4
5
6
7
8
        private void TryResize()
        {
            Count++;
            if (content.Length < Count)
            {
                Array.Resize(ref content, content.Length * 2);
            }
        }
Схема (у меня) была такая: при добавлении увеличиваю количество элементов (фактическое) и если получается так, что это количество не влазиет в список с текущей емкостью, то удваиваю емкость.

Либо ты можешь увеличивать на константу размер массива, но тогда: выигрыш по памяти, проигрыш по скорости.
1
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
14.07.2018, 09:57  [ТС]
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Схема (у меня) была такая: при добавлении увеличиваю количество элементов (фактическое) и если получается так, что это количество не влазиет в список с текущей емкостью, то удваиваю емкость.
Большое спасибо за разьяснение!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.07.2018, 09:57
Помогаю со студенческими работами здесь

В классе Use объявить ArrayList и добавить в каждый элемент ArrayList ID, Name, Text, Song
народ помогите есть класс Card и класс Use, код бросил, namespace KURSOVA { class Card { public string Name {...

ArrayList: необработанное исключение. Операции над множествами с использованием ArrayList
Задача: разработать калькулятор для логических множеств ( для операций пересечение, объединение, разность и симметричная разность). Сделано...

Не проходит код с массивом ArrayList
Доброго времени, господа. Изучаю книгу HeadFirst по java, в 6 главе создаём игру. Я пока новичок, у меня проблема с методом setLocationSet,...

Экспорт данных из таблицы в ArrayList (проверить код)
Здравствуйте! Хочу реализовать класс, в котором будут читаться данные из таблицы в arraylist. Не могу сообразить, как эти данные добавить...

Зачем ресурс определенный в XAML как ArrayList доп-но приводится к типу ArrayList в коде с#?
Ресурс &quot;phones&quot; для ListView определен в XAML как ArrayList. Затем в коде c# он дополнительно приводится к типу ArrayList. Зачем это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru