Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Положить значение в массив Добавлено: 01.07.08 09:33  

Автор вопроса:  olesis
Подскажите или у меня со студией что то или со мной что то :) вот такой вот код



     Dim arr() As String
        Dim i As Integer

        For i = 0 To 10
            arr(i) = "1"
        Next


не работает О_о как можно положить значение в массив? ArrayList не катит, слишком медленный

Ответить

  Ответы Всего ответов: 18  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 01.07.08 10:22
Надо наверное размерность массива задать, как думаешь?) Так ничего не заработает =)
Dim arr(10) as integer

И зачем элементу массива integer присваивать строковое значение - непонятно =)

Ответить

Номер ответа: 2
Автор ответа:
 olesis



Вопросов: 4
Ответов: 30
 Профиль | | #2 Добавлено: 02.07.08 01:49
Погодите, дык размер я не знаю, у меня в цикле в массив будет заноситься строковое значение, вот и думаю :) сколько строк будет тоже не известно :)

И зачем элементу массива integer присваивать строковое значение - непонятно =)

вроде указал Dim arr() As String :)

Ответить

Номер ответа: 3
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #3
Добавлено: 02.07.08 02:05
несовсем ясно, что тебе нужно. опиши подробнее. и вообще опиши задачу, а то есть подозрение, что все делается не так как надо.

Ответить

Номер ответа: 4
Автор ответа:
 olesis



Вопросов: 4
Ответов: 30
 Профиль | | #4 Добавлено: 02.07.08 04:02
Да элементарно, хочу научиться работать с массивами, т.е вопрос такой: Как положить в конец массива строку, как в ArrayList.Add

Ответить

Номер ответа: 5
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #5 Добавлено: 02.07.08 05:06
Dim arr() As String
        Dim i As Integer

        For i = 0 To 10
            redim preserve arr(i)
            arr(i) = "1"
        Next

Ответить

Номер ответа: 6
Автор ответа:
 olesis



Вопросов: 4
Ответов: 30
 Профиль | | #6 Добавлено: 02.07.08 05:11
гениально, то что нужно :) спасибо

Ответить

Номер ответа: 7
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #7 Добавлено: 02.07.08 05:27
:)

Ответить

Номер ответа: 8
Автор ответа:
 Viper



ICQ: 249094859 

Вопросов: 0
Ответов: 310
 Профиль | | #8 Добавлено: 02.07.08 15:46
Dim arr() As String
Dim i As Integer

For i = 0 To 10
    redim preserve arr(i)
    arr(i) = "1"
Next
Ндя... А нафига на каждом то шаге массив переопределять?
Dim i As Integer
redim preserve arr(10)
For i = 0 To 10
    arr(i) = "1"
Next

Ответить

Номер ответа: 9
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #9 Добавлено: 02.07.08 17:32
То Viper
Смотри пост номер 2

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #10
Добавлено: 03.07.08 05:57
Только не факт что массив с постоянным переопределением размера будет шустрее работать чем ArrayList. Лучше проверьте.

Ответить

Номер ответа: 11
Автор ответа:
 Viper



ICQ: 249094859 

Вопросов: 0
Ответов: 310
 Профиль | | #11 Добавлено: 03.07.08 10:29
Если переопределять массив на каждом шаге, то работать будет, мягко говоря, медленно. Лучше изначально распределить достаточно большой массив. А далее, по мере заполнения, увеличивать его размер на заданную величину. После заполнения лишнее обрезать тем же ReDim.

Ответить

Номер ответа: 12
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #12
Добавлено: 03.07.08 10:51
И получится в итоге пародия на ArrayList.

Ответить

Номер ответа: 13
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #13 Добавлено: 03.07.08 16:16
ArrayList не катит, слишком медленный

Жжошь сотона!

Только не факт что массив с постоянным переопределением размера будет шустрее работать чем ArrayList. Лучше проверьте.

Я бы даже сказал, постоянный Redim Preserve будет однозначно работать намного медленнее чем ArrayList/List (лучше юзать List, он типизирован).

Ввиду особенностей реализации массивов в .NET, нет возможности изменить размер существующего массива.
Можно создать новый массив нужного размера, скопировать в него данные со старого, а старый уничтожить. И если посмотреть рефлектором, во что компилируется Redim Preserve то очень хорошо видно что все сводится к вызову Array.Copy

Теперь представь что тебе нужно так "довести" размер массива до 1000 элементов.
Если хранить в массиве Integer, то, грубо говоря, на хранение массива нужно 4 кб. Но во время работы твой код оставит после себя еще пол-мегабайта мусора.
На тесте я утечку не заметил, видимо сборщик мусора эффективно работает с массивами и удаляет их сразу, но все равно ты ощутимо потеряешь в скорости работы.

List работает в принципе на базе того же массива, и для увеличения своего размера увеличивает тот же механизм - создает новый массив большего размера и в него копирует данные из старого. Но увеличение происходит с большим шагом - фактически каждый раз внутренний массив увеличивается в 2 раза.
При добавлении в массив 100 000 элементов это происходит не 100 000 раз, а только 15.


Для сравнения - на 100 000 элементах вариант с Redim Preserve работает около минуты, вариант с List 0.034 секунды.

Помимо того что в этом сценарии List быстрее, он еще и удобнее чем массив.

Ответить

Номер ответа: 14
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #14 Добавлено: 03.07.08 16:18
Вот кстати как изменяется размер List'а при добавлении в него данных:

Ответить

Номер ответа: 15
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 03.07.08 16:18
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072


Прощу прощения за флуд, кнопка Ctrl запала

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам