2012-05-14 19 views

Trả lời

8

Sử dụng ReDim với Bảo tồn để tăng kích thước mảng bằng cách giữ nguyên giá trị cũ.

Vòng lặp ReDim được khuyên dùng khi bạn không có ý tưởng về kích thước và đã biết để tăng kích thước Mảng một.

Dim TeamIndex(), i As Integer 

For i = 0 to 100 
    ReDim Preserve TeamIndex(i) 
    TeamIndex(i) = <some value> 
Next 

Nếu bạn khai báo kích thước của mảng tại sau này trong mã trong bắn sau đó sử dụng

ReDim TeamIndex(100) 

Vì vậy, các mã sẽ là:

Dim TeamIndex(), i As Integer 
ReDim TeamIndex(100) 
For i = 0 to 100 
    TeamIndex(i) = <some value> 
Next 

Bạn có thể Sử dụng ArrayList/Danh sách (T) để sử dụng Thêm/Loại bỏ các giá trị tự động hơn.

Sub Main() 
    ' Create an ArrayList and add three strings to it. 
    Dim list As New ArrayList 
    list.Add("Dot") 
    list.Add("Net") 
    list.Add("Perls") 
    ' Remove a string. 
    list.RemoveAt(1) 
    ' Insert a string. 
    list.Insert(0, "Carrot") 
    ' Remove a range. 
    list.RemoveRange(0, 2) 
    ' Display. 
    Dim str As String 
    For Each str In list 
     Console.WriteLine(str) 
    Next 
    End Sub 

List(Of T) MSDN

List(Of T) DotNetperls

+0

Không cần phải định lại và bảo tồn. Chỉ cần khởi tạo mảng với kích thước 100 [kích thước giả định là 100] – Writwick

+0

'Đối với i = 0 đến SomeNo'. Vì vậy, nếu Array sẽ được khởi tạo 'As New Integer (SomeNo)', 'ReDim' và' Preserve' sẽ không cần thiết trong trường hợp này [Example by asker] là 'SomeNo' là hằng số. Theo đó, nếu 'SomeNo' cũng biến và liên tục thay đổi thì' ReDim' và 'Preserve' sẽ là cần thiết! – Writwick

+1

+1 nhưng Danh sách (Of T) nên được ưu tiên hơn ArrayList cho mã mới – MarkJ

2

Không có gì trong câu trả lời Romil của mà tôi cho là sai nhưng tôi sẽ đi xa hơn. ReDim Preserve là một lệnh rất hữu ích nhưng điều quan trọng là nhận ra rằng đó là một lệnh đắt tiền và sử dụng nó một cách khôn ngoan.

xem xét:

Dim TeamIndex(), i As Integer 
For i = 0 to 100 
    ReDim Preserve TeamIndex(i) 
    TeamIndex(i) = <some value> 
Next 

Đối với mỗi vòng lặp, trừ i = 0, Common Language Runtime (CLR) phải:

  • tìm không gian cho một mảng số nguyên mới đó là một yếu tố lớn hơn mảng trước
  • sao chép các giá trị trên từ mảng trước
  • khởi tạo phần tử mới
  • giải phóng mảng trước đó để thu gom rác thải.

ArrayList là tuyệt vời nếu bạn cần thêm hoặc xóa phần tử ở giữa mảng nhưng bạn đang trả tiền cho chức năng đó ngay cả khi bạn không cần. Ví dụ: nếu bạn đang đọc các giá trị từ một tệp và lưu trữ chúng theo tuần tự nhưng không biết trước số lượng giá trị sẽ có, thì ArrayList mang một chi phí lớn mà bạn có thể tránh.

tôi luôn luôn sử dụng ReDim như thế này:

Dim MyArray() As XXX 
Dim InxMACrntMax As Integer 

ReDim MyArray(1000) 
InxMACrntMax=-1 

Do While more data to add to MyArray 

    InxMACrntMax = InxMACrntMax + 1 
    If InxMACrntMax > UBound(MyArray) Then 
    ReDim Preserve MyArray(UBound(MyArray)+100) 
    End If 
    MyArray(InxMACrntMax) = NewValue 

Loop     

ReDim MyArray(InxMACrntMax) ' Discard excess elements 

Trên Tôi đã sử dụng 100 và 1000. Các giá trị tôi chọn phụ thuộc vào đánh giá của tôi về yêu cầu có khả năng.

Các vấn đề liên quan