2009-06-08 5 views

답변

22

당신 ReDim 문을 사용할 수 있지만이 정말 '외설 최선의 선택. 배열의 크기가 자주 변경 될 경우 특히이 추가되는 것처럼 들리므로 일반 List(Of T) 또는 유사한 컬렉션 유형을 사용해야합니다.

당신은 당신이 마지막에 항목을 추가하는 것은 MyList.Add(item)

는, 일반적인 목록을 사용하여 파일의 상단에 Imports System.Collections.Generics를 추가하려면 한 쉽게 것을 추가로, 배열을 사용하는 것처럼 사용할 수 있습니다. 이 같은

Dim MyList As New List(Of Integer)() 

또는 문자열 목록 : 그럼, 당신은이 같은 새로운 정수리스트를 선언 할

Dim MyList As New List(Of String)() 

당신은 생각을해야한다.

+1

안녕하세요! 당신 말이 맞습니다. 이것이 최고의 해결책입니다. 목록 신고 방법을 보여 주시겠습니까? –

+1

오 예, 확실히 +1 목록에 대한 입니다. 먼저 다른 오브젝트 옵션을 먼저 사용할 수 있는지 물어 보았습니다. 8^D –

1

새 크기를 지정하려면 ReDim 명령을 사용하십시오.

ReDim MyArray(MyArray.Length + 1) 
+1

이 하나 나던 작업이 작품은, 그것은 나를 'ReDim을'문이 배열의 각 차원의 새로운 경계의 괄호 목록을 필요로 오류 제공합니다. –

+1

감사합니다. 이렇게하면됩니다. Redim MyArray, (MyArray.Length + 1) –

+0

이렇게하면'ReDim'이 매개 변수로 길이가 아닌 새로운 _upper bound_를 기대하기 때문에 배열 크기가 1이 아닌 2 씩 증가합니다 . –

1

내가 컬렉션 클래스의 몇 가지 유형을 선호하지만, 당신이 배열을 사용하려면 다음과 같이 그것을 할 것입니다 :

Dim arr() As Integer 
Dim cnt As Integer = 0 
Dim ix As Integer 

For ix = 1 To 1000 
    cnt = cnt + 1 
    ReDim arr(cnt) 
    arr(cnt - 1) = ix 
Next 
+0

이것은 N^2가됩니다. 당신은 [Shlemiel의 화가의 알고리즘] (http://www.joelonsoftware.com/articles/fog0000000319.html)을 말할 수 있습니까? –

+0

ReDim 줄의 인수는 길이가 아니라 * 마지막 인덱스입니다.따라서 배열에서 배열의 길이는 cnt + 1이되고 배열의 끝에는 정의되지 않은 값이 남습니다 (실제로는 정의되지 않지만 * Nothing *과 같습니다). ([문서] (http://msdn.microsoft.com/en-us/library/w8k3cys2.aspx)에서는 명확하지 않지만 Visual Studio의 디버거를 사용하여보다 명확하게 시도 할 수 있습니다. "상한은 차원의 길이가 아니라 해당 차원의 가장 높은 인덱스 값입니다." –

0

요엘이 말했듯이 목록을 사용하십시오.

Dim MyList As New List(Of String) 

String을로 변경하는 것을 잊지 마십시오. 사용중인 데이터 유형 중.

8

제안 된 ReDim의 경우이 시나리오에서 키워드 보존이 필요합니다.

ReDim Preserve MyArray(n) 
+2

이 질문은 현재 30,000 건이 넘기 때문에 "Preserve"키워드는 실제로 원래 배열을 유지하지 않고 완전히 새로운 배열을 할당하고 원래 하나 하나의 요소 ... 당신이 원하는 것이면 괜찮습니다. 그러나 일반적으로 프로그래머는 더 효율적인 것을 기대하고 있습니다. –

1

나만의 컬렉션 클래스를 만들 수도 있습니다. 새로운 프로그래머를위한 좋은 프로그래밍 연습.

Public Class MyList 
Private Items() As String 
Private No As Integer = 0 
Public Sub Add(ByVal NewItem As String) 

    ''Create a temporary new string array 

    Dim CopyString(No) As String 

    ''Copy values from Global Variable Items() to new CopyString array 

    For i As Integer = 0 To No - 1 
     CopyString(i) = Items(i) 
    Next 

    ''Add new value - NewItem - to CopyString 

    CopyString(No) = NewItem 

    ''Increment No to No + 1 

    No += 1 

    ''Copy CopyString to Items 

    Items = CopyString 

    'Discard CopyString 

    CopyString = Nothing 

End Sub 
Public Sub Show(ByVal index As Integer) 
    MsgBox(Items(index)) 
End Sub 
End Class 

''Now create a form with a TextBox name - txt, Button1 and Button2 

Public Class Form1 

''Declare txts as a new MyList Class 

Private txts As New MyList 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    ''Add text to txts which is a MyList Class 

    txts.Add(txt.Text) 
    txt.Text = "" 

End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 

    ''Display value at a specific index 

    txts.Show(Convert.ToInt16(txt.Text)) 
    txt.Text = "" 

End Sub 
End Class 
7

일반적인 목록을 사용하는 것이 좋습니다. 그러나 배열의 크기를 변경하려면 Array.Resize(ByRef arr, newSize)을 사용할 수 있습니다.

ReDim은 (꽤 나쁜) 아이디어 (VB 특정 유산, 매우 느림)가 아닙니다.

+0

이것은 기존의 답변 중 두 가지를 주로 논평 한 것으로 보입니다. – Blackwood

+2

글쎄, 아무도 언급 Array.Resize() 그래서, 나는 동의하지 않습니다. –

+1

필자는'Array.Resize'가 고풍스러운'ReDim'보다 선호되어야한다고 동의합니다. 나쁜 소식은 두 사람이 아마도 똑같이 느리다는 것입니다. –

0

Dim Table1 As New DataTable 
    ' Define columns 
    Table1.Columns.Add("Column1", GetType(System.String)) 
    Table1.Columns.Add("Column2", GetType(System.Int32)) 
    Table1.Columns.Add("Column3", GetType(System.Int32)) 
    ' Add a row of data 
    Table1.Rows.Add("Item1", 44, 99) 
    Table1.Rows.Add("Item2", 42, 3) 
    Table1.Rows.Add("Item3", 42, 3) 
    Table1.Rows.Add("Item4", 42, 3) 
    Dim arr(-1) As String 
    For Each dr As DataRow In Table1.Rows 
     ReDim Preserve arr(arr.Length) 
     arr(arr.Length - 1) = dr("Column1") 
    Next 
관련 문제