2011-01-26 1 views
2

Допустим, я хочу, чтобы создать массив с 20 элементами всех установленных на значение по умолчанию (скажем, 0)Создание массивов и изменение размеров их

Но позже, во время выполнения, я мог бы изменить размер массива. Я мог бы сделать его больше, чтобы поддерживать 30 элементов. 10 новых элементов будут иметь значение по умолчанию 0.

Или мне может понадобиться сделать мой массив меньшим, всего до 5. Поэтому я удаляю полное существование последних 15 элементов массива.

Спасибо.

ответ

2

ReDim Preserve сделает это, и если массив объявлен на уровне модуля, любой код, ссылающийся на него, не потеряет ссылку. Однако я верю, что это специфично для vb, и есть также ограничение производительности, так как это также создает копию массива.

Я не проверял, но я подозреваю, что описанный выше метод user274204, вероятно, подходит для CLR-совместимого способа. ,

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    'Initialize your array: 
    Dim Integers(20) As Integer 

    'Output to the console, and you will see 20 elements of value 0 
    Me.OutputArrayValues(Integers) 

    'Iterate through each element and assign an integer Value: 
    For i = 0 To UBound(Integers) 
     Integers(i) = i 
    Next 

    'Output to console, and you will have values from 0 to 20: 
    Me.OutputArrayValues(Integers) 

    'Use Redim Preserve to expand the array to 30 elements: 
    ReDim Preserve Integers(30) 

    'output will show the same 0-20 values in elements 0 thru 20, and then 10 0 value elements: 
    Me.OutputArrayValues(Integers) 

    'Redim Preserve again to reduce the number of elements without data loss: 
    ReDim Preserve Integers(15) 

    'Same as above, but elements 16 thru 30 are gone: 
    Me.OutputArrayValues(Integers) 

    'This will re-initialize the array with only 5 elements, set to 0: 
    ReDim Integers(5) 
    Me.OutputArrayValues(Integers) 


End Sub 

Private Sub OutputArrayValues(ByVal SomeArray As Array) 
    For Each i As Object In SomeArray 
     Console.WriteLine(i) 
    Next 
End Sub 

End Class

+0

То, что выглядит, как много кода просто куча комментариев, объясняющих, что происходит. – XIVSolutions

+0

Спасибо! Попробуем это :) – Voldemort

+0

Обратите внимание, что для многомерных массивов это работает только для последнего измерения. Вот ссылка с дополнительной информацией: http://msdn.microsoft.com/en-us/library/w8k3cys2(VS.71).aspx – XIVSolutions

0

Невозможно изменить размер массива (или любого другого объекта в этом случае) после его создания.

Вы можете использовать System.Array.Resize (ref T [], int) для аналогичного эффекта. Однако это фактически создаст новый массив с соответствующими фрагментами, скопированными в разные стороны, и может не быть тем, что вы хотите, если есть несколько ссылок на массив, рассеянный вокруг.