Visual Basic'de Diziler

Dizi, mantıksal olarak birbirine bağlı öğeler olarak anilen değerler kümesidir. Örneğin, bir dizi bir dil bilgisi okulunu her sınıftaki öğrenci sayısından oluşur; dizideki her öğe, tek bir sınıftaki öğrenci sayısıdır. Benzer şekilde, bir dizi bir öğrencinin bir sınıfa notlardan oluşur; dizinin her öğesi tek bir sınıftır.

Her veri öğemizi depolamak için tek tek değişkenleri kullanmak mümkündür. Örneğin, uygulamamız öğrenci notlarını analiz ediyorsa, her öğrencinin notu için , vb. gibi ayrı bir değişken englishGrade1 englishGrade2 kullanabiliriz. Bu yaklaşımın üç önemli sınırlaması vardır:

  • Tasarım zamanında işlememiz gereken notların tam olarak kaç tane olduğunu bilmek zorunda oluruz.
  • Çok sayıda notların hızla işlenmesi kolay hale gelir. Bu da bir uygulamanın ciddi hatalara sahip olma ihtimalini çok daha yüksek hale sağlar.
  • Bakımı zordur. Ekleymız her yeni sınıf, uygulamanın değiştirilmelerini, yeniden derlemelerini ve yeniden dağıtılmasını gerektirir.

Bir dizi kullanarak, bu ilgili değerlere aynı adla başvurarak ve dizideki konumunu temel alarak tek bir öğeyi tanımlamak için dizin veya alt simge olarak adlandırılan bir sayı kullanabilirsiniz. Bir dizinin dizinleri, dizide toplam öğe sayısından 0 ile bir arasında olabilir. Bir dizinin Visual Basic tanımlamak için bir dizi söz dizimi kullanırken, dizide toplam öğe sayısını değil en yüksek dizinini belirtirsiniz. Diziyle bir birim olarak çalışabilirsiniz ve öğelerinin bir kez daha yenisini yapma özelliği, tasarım zamanında tam olarak kaç öğe içerdiğini bilmek zorundaliğinizi serbest bıraktır.

Açıklamadan önce bazı hızlı örnekler:

' Declare a single-dimension array of 5 numbers.
Dim numbers(4) As Integer

' Declare a single-dimension array and set its 4 values.
Dim numbers = New Integer() {1, 2, 4, 8}

' Change the size of an existing array to 16 elements and retain the current values.
ReDim Preserve numbers(15)

' Redefine the size of an existing array and reset the values.
ReDim numbers(15)

' Declare a 6 x 6 multidimensional array.
Dim matrix(5, 5) As Double

' Declare a 4 x 3 multidimensional array and set array element values.
Dim matrix = New Integer(3, 2) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}

' Declare a jagged array
Dim sales()() As Double = New Double(11)() {}

Basit bir dizide dizi öğeleri

Şimdi bir dil bilgisi okulunu students her sınıftaki öğrenci sayısını depolamak için adlı bir dizi oluşturyalım. Öğelerin dizinleri 0 ile 6 arasında olabilir. Bu diziyi kullanmak, yedi değişken bildirerek daha basittir.

Aşağıdaki çizimde dizisi students gösterilmiştir. Dizinin her öğesi için:

  • Öğenin dizini, notu temsil eder (dizin 0, temsil eder).

  • öğesinde yer alan değer, o sınıftaki öğrenci sayısını temsil eder.

Öğrenci sayılarının dizisini gösteren diyagram

Aşağıdaki örnek, diziyi Visual Basic kullanan bir kod içerir:


Module SimpleArray
   Public Sub Main()
      ' Declare an array with 7 elements.
      Dim students(6) As Integer

      ' Assign values to each element.
      students(0) = 23
      students(1) = 19
      students(2) = 21
      students(3) = 17
      students(4) = 19
      students(5) = 20
      students(6) = 22
      
      ' Display the value of each element.
      For ctr As Integer = 0 To 6
         Dim grade As String = If(ctr = 0, "kindergarten", $"grade {ctr}")
         Console.WriteLine($"Students in {grade}: {students(ctr)}")
      Next
   End Sub
End Module
' The example displays the following output:
'     Students in kindergarten: 23
'     Students in grade 1: 19
'     Students in grade 2: 21
'     Students in grade 3: 17
'     Students in grade 4: 19
'     Students in grade 5: 20
'     Students in grade 6: 22

Örnek üç şey yapar:

  • Yedi öğe içeren students bir diziyi bildirer. Dizi bildiriminde yer alan sayı, dizide son dizini gösterir; dizide öğe 6 sayısından bir küçük olur.
  • Dizideki her öğeye değer atar. Dizi öğelerine, dizi adı kullanılarak ve tek öğenin dizini parantez içinde dahil kullanılarak erişilir.
  • Dizinin her değerini listeler. Örnek, dizinin her For öğesine dizin numarasına göre erişmek için deyimini kullanır.

Önceki students örnekte yer alan dizi, bir dizin kullandığı için tek boyutlu bir dizidir. Birden fazla dizin veya alt simge kullanan bir diziye çok boyutlu denir. Daha fazla bilgi için bu makalenin geri kalanına ve Visual Basic.

Dizi oluşturma

Bir dizinin boyutunu çeşitli yollarla tanımlayabilirsiniz:

  • Dizi bildirilene kadar boyutu belirtesiniz:

    ' Declare an array with 10 elements.
    Dim cargoWeights(9) As Double               
    ' Declare a 24 x 2 array.
    Dim hourlyTemperatures(23, 1) As Integer
    ' Declare a jagged array with 31 elements.
    Dim januaryInquiries(30)() As String
    
  • Bir dizi New oluşturulduğunda boyutunu sağlamak için yan tümcesini kullanabilirsiniz:

    ' Declare an array with 10 elements.
    Dim cargoWeights() As Double = New Double(9) {}
    ' Declare a 24 x 2 array.
    Dim hourlyTemperatures(,) As Integer = New Integer(23, 1) {}
    ' Declare a jagged array with 31 elements. 
    Dim januaryInquiries()() As String = New String(30)() {}
    

Mevcut bir diziniz varsa, deyimini kullanarak boyutunu yeniden tanımlamanız ReDim gerekir. deyiminin ReDim dizide yer alan değerleri tutması veya boş bir dizi oluşturması belirtebilirsiniz. Aşağıdaki örnek, mevcut bir dizinin boyutunu ReDim değiştirmek için deyiminin farklı kullanımlarını gösterir.

' Assign a new array size and retain the current values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)

Daha fazla bilgi için bkz. ReDim Deyimi.

Değerleri dizide depolama

türünde bir dizin kullanarak bir dizide her konuma Integer erişebilirsiniz. Parantez içindeki dizinini kullanarak her bir dizi konumuna başvurarak bir dizide değer depolayarak ve alabilirsiniz. Çok boyutlu diziler için dizinler virgülle (,) ayrılır. Her dizi boyutu için bir dizine ihtiyacınız vardır.

Aşağıdaki örnek, dizilerde değer depoleyen ve alan bazı deyimleri gösterir.


Module Example
   Public Sub Main()
      ' Create a 10-element integer array.
      Dim numbers(9) As Integer
      Dim value As Integer = 2
        
      ' Write values to it.
      For ctr As Integer = 0 To 9
         numbers(ctr) = value
         value *= 2
      Next
        
      ' Read and sum the array values.  
      Dim sum As Integer
      For ctr As Integer = 0 To 9
         sum += numbers(ctr)
      Next
      Console.WriteLine($"The sum of the values is {sum:N0}")
    End Sub
End Module
' The example displays the following output:
'     The sum of the values is 2,046

Dizi sabit değerleriyle diziyi doldurmak

Dizi değişmez değeri kullanarak, bir diziyi oluşturmakla aynı anda ilk değer kümesiyle doldurmak için kullanılabilir. Dizi değişmez değeri, ayraç () içine alınmış virgülle ayrılmış değerlerin listesinden {} oluşur.

Dizi sabiti kullanarak bir dizi oluşturma, dizi türünü veya dizi türünü belirlemek için tür çıkarı kullanabilirsiniz. Aşağıdaki örnekte her iki seçenek de gösterir.

' Array literals with explicit type definition.
Dim numbers = New Integer() {1, 2, 4, 8}
' Array literals with type inference.
Dim doubles = {1.5, 2, 9.9, 18}
' Array literals with explicit type definition.
Dim articles() As String = { "the", "a", "an" }

' Array literals with explicit widening type definition.
Dim values() As Double = { 1, 2, 3, 4, 5 }

Tür çıkarı kullanırken, dizi türü değişmez değer listesinde baskın tür tarafından belirlenir. Baskın tür, dizide yer alan diğer tüm türlerin genişletileye türü olur. Bu benzersiz tür belirlene belirlenirse baskın tür, dizide yer alan diğer tüm türlerin daraltılamayacak benzersiz tür olmasıdır. Bu benzersiz türlerden hiçbiri belirlenene kadar baskın tür Object olur. Örneğin, dizi değişmez değerine sağlanan değerlerin listesi , ve türünde değerler içeriyorsa, Integer sonuçta elde edilen dizi Long Double Double türündedir. çünkü Integer Long ve yalnızca ile genişletilen Double baskın tür Double olur. Daha fazla bilgi için, bkz. Widening and Narrowing Conversions.

Not

Tür çıkarını yalnızca bir tür üyesinde yerel değişken olarak tanımlanan diziler için kullanabilirsiniz. Açık tür tanımı yoksa, sınıf düzeyinde dizi değişmez değerleriyle tanımlanan diziler Object[] türündedir. Daha fazla bilgi için bkz. Yerel tür çıkarı.

Tüm dizi değişmez değerlerinin türünde olmasına rağmen önceki örneğin values türünde bir dizi olarak Double tanımladığına dikkat Integer eder. Dizi değişmez değeri değerleri değerlere genişleyene olduğundan bu diziyi Double oluşturabilirsiniz.

İç içe dizi değişmez değerlerini kullanarak da çok boyutlu bir dizi oluşturabilir ve bu diziyi doldurmak için kullanılabilirsiniz. İç içe dizi değişmez değerlerinin, sonuçta elde edilen diziyle tutarlı bir dizi boyuta sahip olması gerekir. Aşağıdaki örnek, iç içe dizi değişmez değerlerini kullanarak iki boyutlu bir tamsayı dizisi oluşturur.

' Create and populate a 2 x 2 array.
Dim grid1 = {{1, 2}, {3, 4}}
' Create and populate a 2 x 2 array with 3 elements.
Dim grid2(,) = {{1, 2}, {3, 4}, {5, 6}}

Bir dizi oluşturmak ve doldurmak için iç içe dizi değişmez değerler kullanılırken, iç içe dizi değişmez değerlerinin öğe sayısı eşleşmezse bir hata oluşur. Dizi değişkeninin dizi değişmez değerlerden farklı sayıda boyuta sahip olduğunu açıkça bildirersiniz de bir hata oluşur.

Tek boyutlu dizilerde olduğu gibi, iç içe dizi sabit değerleriyle çok boyutlu bir dizi oluştururken tür çıkarmalarına güvenin. Ertelenmiş tür, tüm iç içe yerleştirme düzeyi için tüm dizi değişmez değerlerde yer alan tüm değerler için baskın tür olur. Aşağıdaki örnek, ve türünde olan değerlerden Double[,] türünde iki boyutlu bir dizi Integer Double oluşturur.

Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Ek örnekler için bkz. Nasıl 2019'da Dizi Değişkeni Visual Basic.

Dizide iterating

Bir dizide yeniden dizine geçerek dizideki her öğeye en düşük dizinden en yüksek dizine veya en yüksekten en düşerek her öğeye erişebilirsiniz. Genellikle, For... Next Deyimi veya For Each... Bir dizinin öğeleriyle iterate için Next Deyimi. Dizinin üst sınırlarını bilmiyorken, dizinin en yüksek değerini Array.GetUpperBound almak için yöntemini çağırebilirsiniz. En düşük dizin değeri neredeyse her zaman 0 olsa da, dizinin en düşük Array.GetLowerBound değerini almak için yöntemini çağırebilirsiniz.

Aşağıdaki örnek, deyimini kullanarak tek boyutlu bir dizide yeniden For...Next uzer.


Module IterateArray
   Public Sub Main()
      Dim numbers = {10, 20, 30}

      For index = 0 To numbers.GetUpperBound(0)
         Console.WriteLine(numbers(index))
      Next
   End Sub
End Module
' The example displays the following output:
'  10
'  20
'  30

Aşağıdaki örnek, deyimini kullanarak çok boyutlu bir dizide devam For...Next eder. yöntemi, GetUpperBound boyutu belirten bir parametreye sahip. GetUpperBound(0) ilk boyutun en yüksek dizinini ve GetUpperBound(1) ikinci boyutun en yüksek dizinini döndürür.


Module IterateArray
   Public Sub Main()
      Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

      For index0 = 0 To numbers.GetUpperBound(0)
         For index1 = 0 To numbers.GetUpperBound(1)
            Console.Write($"{numbers(index0, index1)} ")
         Next
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
' Output 
'  1 2 
'  3 4 
'  5 6

Aşağıdaki örnekte Her biri için... Tek boyutlubir dizi ve iki boyutlu bir dizide devam etmek için Next Deyimi.


Module IterateWithForEach
   Public Sub Main()
      ' Declare and iterate through a one-dimensional array.
      Dim numbers1 = {10, 20, 30}
      
      For Each number In numbers1
         Console.WriteLine(number)
      Next
      Console.WriteLine()
      
      Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

      For Each number In numbers
         Console.WriteLine(number)
      Next
   End Sub
End Module
' The example displays the following output:
'  10
'  20
'  30
'
'  1
'  2
'  3
'  4
'  5
'  6

Dizi boyutu

Bir dizinin boyutu, tüm boyutlarının uzunluklarının ürünüdür. Şu anda dizide yer alan öğelerin toplam sayısını temsil eder. Örneğin, aşağıdaki örnek her boyutta dört öğe içeren 2 boyutlu bir dizi bildirer. Örneğin çıktısı olarak, dizinin boyutu 16 (veya (3 + 1) * (3 + 1) olur.


Module Example
   Public Sub Main()
      Dim arr(3, 3) As Integer
      Console.WriteLine(arr.Length)     
   End Sub
End Module
' The example displays the following output:
'     16

Not

Dizi boyutuyla ilgili bu tartışma, etiketli diziler için geçerli değildir. Jagged diziler hakkında bilgi almak ve bir jagged dizisinin boyutunu belirlemek için Bkz. Jagged arrays bölümü.

özelliğini kullanarak bir dizinin boyutunu Array.Length bulabilirsiniz. yöntemini kullanarak çok boyutlu bir dizinin her boyutunun uzunluğunu Array.GetLength bulabilirsiniz.

Bir dizi değişkenine yeni bir dizi nesnesi ataarak veya Deyimi deyimini kullanarak yeniden ReDim boyutlandırabilirsiniz. Aşağıdaki örnek, 100 öğeli bir diziyi 51 öğeli bir diziye değiştirmek ReDim için deyimini kullanır.


Module Example
   Public Sub Main()
      Dim arr(99) As Integer
      Console.WriteLine(arr.Length)
      
      Redim arr(50)
      Console.WriteLine(arr.Length)
   End Sub
End Module
' The example displays the following output:
'     100
'     51

 

Bir dizinin boyutuyla ilgilenmek için göz keep mind birkaç şey vardır.

Notlar
Boyut uzunluğu Her boyutun dizini 0 tabanlıdır, bu da 0 ' dan büyük ' a kadar değişen anlamına gelir. Bu nedenle, belirli bir boyutun uzunluğu, bu boyutun belirtilen üst sınırından bir büyük.
Uzunluk sınırları Bir dizinin her boyutunun uzunluğu, en fazla Integer veri türü değeri olan Int32.MaxValue veya (2 ^ 31)-1 olacak şekilde sınırlıdır. Ancak, bir dizinin toplam boyutu, sisteminizdeki kullanılabilir bellek ile de sınırlıdır. Kullanılabilir bellek miktarını aşan bir diziyi başlatmaya çalışırsanız, çalışma zamanı bir oluşturur OutOfMemoryException .
Boyut ve öğe boyutu Bir dizinin boyutu, öğelerinin veri türünden bağımsızdır. Boyut her zaman, bellekte kullandıkları bayt sayısını değil, toplam öğe sayısını temsil eder.
Bellek tüketimi Bir dizinin bellekte nasıl depolandığına ilişkin varsayımlar yapmak güvenli değildir. Depolama, farklı veri genişliklerinin platformları üzerinde farklılık gösterir. bu nedenle, aynı dizi 64 bitlik bir sistemde 32 bitlik bir sistemde daha fazla bellek tüketebilirler. Bir diziyi başlattığınızda sistem yapılandırmasına bağlı olarak, ortak dil çalışma zamanı (CLR) depolama alanını paket öğelerine mümkün olduğunca yakın bir şekilde veya tüm doğal donanım sınırları üzerinde hizalamak için atayabilir. Ayrıca, bir dizi, denetim bilgileri için bir depolama ek yükü gerektirir ve bu ek yük, eklenen her boyutla birlikte artar.

Dizi türü

Her dizide, öğelerinin veri türünden farklı bir veri türü vardır. Tüm diziler için tek bir veri türü yoktur. Bunun yerine, bir dizinin veri türü, dizinin boyut sayısı veya sıralaması ile dizideki öğelerin veri türü tarafından belirlenir. İki dizi değişkeni yalnızca aynı dereceye sahip olduklarında ve öğeleri aynı veri türüne sahip olduğunda aynı veri türündedir. Bir dizinin boyutlarının uzunlukları dizi veri türünü etkilemez.

Her dizi System.Array sınıfından devralır ve bir değişkeni türünde olacak şekilde bildirebilirsiniz Array , ancak türünde bir dizi oluşturamazsınız Array . Örneğin, aşağıdaki kod arr değişkeni türünde olacak şekilde bildirir Array ve Array.CreateInstance dizi örneği oluşturmak için yöntemini çağırır, dizinin türü Object [] olarak kanıtlar.


Module Example
   Public Sub Main()
      Dim arr As Array = Array.CreateInstance(GetType(Object), 19)
      Console.WriteLine(arr.Length)
      Console.WriteLine(arr.GetType().Name)
   End Sub
End Module
' The example displays the following output:
'     19
'     Object[]

Ayrıca, ReDim deyimleri tür olarak belirtilen bir değişken üzerinde çalışamaz Array . Bu nedenlerle ve tür güvenliği için her dizinin belirli bir tür olarak bildirilmesini önerilir.

Bir dizinin veya öğelerinin veri türünü çeşitli yollarla bulabilirsiniz.

  • GetType Type Değişkeninin çalışma zamanı türünü temsil eden bir nesne almak için, değişkenine yöntemini çağırabilirsiniz. TypeNesnesi, özellikleri ve yöntemlerinde kapsamlı bilgiler içerir.
  • TypeName String Çalışma zamanı türünün adı ile almak için değişkeni işleve geçirebilirsiniz.

Aşağıdaki örnek, GetType TypeName bir dizinin türünü belirlemekte hem yöntemini hem de işlevini çağırır. Dizi türü Byte(,) . Type.BaseTypeÖzelliği, bayt dizisinin temel türünün sınıf olduğunu da belirtir Array .


Module Example
   Public Sub Main()
      Dim bytes(9,9) As Byte
      Console.WriteLine($"Type of {nameof(bytes)} array: {bytes.GetType().Name}")
      Console.WriteLine($"Base class of {nameof(bytes)}: {bytes.GetType().BaseType.Name}")
      Console.WriteLine()
      Console.WriteLine($"Type of {nameof(bytes)} array: {TypeName(bytes)}")
   End Sub
End Module
' The example displays the following output:
' Type of bytes array: Byte[,]
' Base class of bytes: Array
' 
' Type of bytes array: Byte(,)


Dönüş değerleri ve parametreleri olarak diziler

Bir yordamdan bir dizi döndürmek için Function , dizi veri türü ve boyut sayısını işlev ifadesinindönüş türü olarak belirtin. İşlevi içinde, aynı veri türüne ve boyut sayısına sahip bir yerel dizi değişkeni bildirin. Return ifadesinde, yerel dizi değişkenini parantez olmadan dahil edin.

Bir diziyi veya yordamına parametre olarak belirtmek için Sub Function , parametreyi belirtilen veri türüne ve boyut sayısına sahip bir dizi olarak tanımlayın. Yordamın çağrısında, aynı veri türüne ve boyut sayısına sahip bir dizi değişkeni geçirin.

Aşağıdaki örnekte GetNumbers işlev, Integer() türünde tek boyutlu bir dizi döndürür Integer . ShowNumbersYordam bir Integer() bağımsız değişkeni kabul eder.


Module ReturnValuesAndParams
   Public Sub Main()
      Dim numbers As Integer() = GetNumbers()
      ShowNumbers(numbers)
   End Sub

   Private Function GetNumbers() As Integer()
      Dim numbers As Integer() = {10, 20, 30}
      Return numbers
   End Function

   Private Sub ShowNumbers(numbers As Integer())
      For index = 0 To numbers.GetUpperBound(0)
         Console.WriteLine($"{numbers(index)} ")
      Next
   End Sub
End Module
' The example displays the following output:
'   10
'   20
'   30
    

Aşağıdaki örnekte, GetNumbersMultiDim işlevi bir Integer(,) türünde iki boyutlu bir dizi döndürür Integer . ShowNumbersMultiDimYordam bir Integer(,) bağımsız değişkeni kabul eder.


Module Example
   Public Sub Main()
      Dim numbers As Integer(,) = GetNumbersMultidim()
      ShowNumbersMultidim(numbers)
   End Sub

   Private Function GetNumbersMultidim() As Integer(,)
      Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
      Return numbers
   End Function

   Private Sub ShowNumbersMultidim(numbers As Integer(,))
      For index0 = 0 To numbers.GetUpperBound(0)
         For index1 = 0 To numbers.GetUpperBound(1)
            Console.Write($"{numbers(index0, index1)} ")
         Next
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
'     1 2
'     3 4
'     5 6

Sivri diziler

Bazen uygulamanızdaki veri yapısı iki boyutlu ancak dikdörtgen değildir. Örneğin, ayın her gününün yüksek sıcaklığına ilişkin verileri depolamak için bir dizi kullanabilirsiniz. Dizinin ilk boyutu ayı temsil eder, ancak ikinci boyut gün sayısını ve ay içindeki gün sayısını temsil eder. Dizi dizileri olarak da adlandırılan pürüzlü bir dizi, bu tür senaryolar için tasarlanmıştır. Pürüzlü dizi öğeleri de diziler olan bir dizidir. Sivri dizi ve pürüzlü dizideki her öğe bir veya daha fazla boyuta sahip olabilir.

Aşağıdaki örnek, her bir bir gün dizisi olan her öğesi bir ay dizisini kullanır. Farklı aylar farklı gün sayılarına sahip olduğundan, örnek pürüzlü bir diziyi kullanır. Örnek, pürüzlü bir dizi oluşturmayı, bu değere değer atamayı ve değerlerini almayı ve görüntülemeyi gösterir.

Imports System.Globalization

Module JaggedArray
   Public Sub Main()
      ' Declare the jagged array of 12 elements. Each element is an array of Double.
      Dim sales(11)() As Double
      ' Set each element of the sales array to a Double array of the appropriate size.
      For month As Integer = 0 To 11
         ' The number of days in the month determines the appropriate size.
         Dim daysInMonth As Integer =
            DateTime.DaysInMonth(Year(Now), month + 1)
         sales(month) = New Double(daysInMonth - 1) {}
      Next 

      ' Store values in each element.
      For month As Integer = 0 To 11
         For dayOfMonth = 0 To sales(month).GetUpperBound(0)
            sales(month)(dayOfMonth) = (month * 100) + dayOfMonth
         Next
      Next

      ' Retrieve and display the array values.
      Dim monthNames = DateTimeFormatInfo.CurrentInfo.AbbreviatedMonthNames
      ' Display the month names.
      Console.Write("    ")
      For ctr = 0 To sales.GetUpperBound(0)
         Console.Write($" {monthNames(ctr)}   ")
      Next   
      Console.WriteLine()
      ' Display data for each day in each month.
      For dayInMonth = 0 To 30
         Console.Write($"{dayInMonth + 1,2}.  ")
         For monthNumber = 0 To sales.GetUpperBound(0)
            If dayInMonth > sales(monthNumber).GetUpperBound(0) Then 
               Console.Write("       ")
            Else
               Console.Write($"{sales(monthNumber)(dayInMonth),-5}  ")
            End If
         Next   
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
'      Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
'  1.  0      100    200    300    400    500    600    700    800    900    1000   1100
'  2.  1      101    201    301    401    501    601    701    801    901    1001   1101
'  3.  2      102    202    302    402    502    602    702    802    902    1002   1102
'  4.  3      103    203    303    403    503    603    703    803    903    1003   1103
'  5.  4      104    204    304    404    504    604    704    804    904    1004   1104
'  6.  5      105    205    305    405    505    605    705    805    905    1005   1105
'  7.  6      106    206    306    406    506    606    706    806    906    1006   1106
'  8.  7      107    207    307    407    507    607    707    807    907    1007   1107
'  9.  8      108    208    308    408    508    608    708    808    908    1008   1108
' 10.  9      109    209    309    409    509    609    709    809    909    1009   1109
' 11.  10     110    210    310    410    510    610    710    810    910    1010   1110
' 12.  11     111    211    311    411    511    611    711    811    911    1011   1111
' 13.  12     112    212    312    412    512    612    712    812    912    1012   1112
' 14.  13     113    213    313    413    513    613    713    813    913    1013   1113
' 15.  14     114    214    314    414    514    614    714    814    914    1014   1114
' 16.  15     115    215    315    415    515    615    715    815    915    1015   1115
' 17.  16     116    216    316    416    516    616    716    816    916    1016   1116
' 18.  17     117    217    317    417    517    617    717    817    917    1017   1117
' 19.  18     118    218    318    418    518    618    718    818    918    1018   1118
' 20.  19     119    219    319    419    519    619    719    819    919    1019   1119
' 21.  20     120    220    320    420    520    620    720    820    920    1020   1120
' 22.  21     121    221    321    421    521    621    721    821    921    1021   1121
' 23.  22     122    222    322    422    522    622    722    822    922    1022   1122
' 24.  23     123    223    323    423    523    623    723    823    923    1023   1123
' 25.  24     124    224    324    424    524    624    724    824    924    1024   1124
' 26.  25     125    225    325    425    525    625    725    825    925    1025   1125
' 27.  26     126    226    326    426    526    626    726    826    926    1026   1126
' 28.  27     127    227    327    427    527    627    727    827    927    1027   1127
' 29.  28            228    328    428    528    628    728    828    928    1028   1128
' 30.  29            229    329    429    529    629    729    829    929    1029   1129
' 31.  30            230           430           630    730           930           1130

Önceki örnek, bir döngü kullanarak öğe temelinde öğe temelinde pürüzlü diziye değerler atar For...Next . Ayrıca, iç içe dizi değişmez değerlerini kullanarak pürüzlü bir dizinin öğelerine değerler atayabilirsiniz. Ancak, iç içe dizi değişmez değerlerini kullanma girişimi (örneğin, Dim valuesjagged = {{1, 2}, {2, 3, 4}} ) derleyici hatası oluşturur BC30568. Hatayı düzeltmek için, iç dizi değişmez değerlerini parantez içine alın. Parantez, dizi değişmez ifadesinin değerlendirilmesini zorlar ve elde edilen değerler, aşağıdaki örnekte gösterildiği gibi dış dizi sabiti ile birlikte kullanılır.


Module Example
   Public Sub Main()
      Dim values1d = { 1, 2, 3 }
      Dim values2d = {{1, 2}, {2, 3}, {3, 4}}
      Dim valuesjagged = {({1, 2}), ({2, 3, 4})}
   End Sub
End Module

Sivri dizi öğeleri diziler içeren tek boyutlu bir dizidir. Bu nedenle, Array.Length özelliği ve Array.GetLength(0) yöntemi tek boyutlu dizideki öğelerin sayısını döndürür ve Array.GetLength(1) pürüzlü bir IndexOutOfRangeException dizi çok boyutlu olmadığından bir oluşturur. Her bir alt dizinin özelliğinin değerini alarak her bir alt dizideki öğelerin sayısını belirlersiniz Array.Length . Aşağıdaki örnek, pürüzlü bir dizideki öğelerin sayısının nasıl belirleneceğini göstermektedir.


Module Example
   Public Sub Main()
      Dim jagged = { ({1, 2}), ({2, 3, 4}), ({5, 6}), ({7, 8, 9, 10}) }
      Console.WriteLine($"The value of jagged.Length: {jagged.Length}.")
      Dim total = jagged.Length
      For ctr As Integer = 0 To jagged.GetUpperBound(0)
         Console.WriteLine($"Element {ctr + 1} has {jagged(ctr).Length} elements.") 
         total += jagged(ctr).Length 
      Next
      Console.WriteLine($"The total number of elements in the jagged array: {total}")
   End Sub
End Module
' The example displays the following output:
'     The value of jagged.Length: 4.
'     Element 1 has 2 elements.
'     Element 2 has 3 elements.
'     Element 3 has 2 elements.
'     Element 4 has 4 elements.
'     The total number of elements in the jagged array: 15

Sıfır uzunluklu diziler

Visual Basic, başlatılmamış bir dizi (değeri olan bir dizi Nothing ) ve sıfır uzunluklu bir dizi ya da boş dizi (öğesi olmayan bir dizi) arasında ayrım yapar. Başlatılmamış bir dizi, boyutlandırılmış olmayan veya kendisine atanmış değer içeren bir dizidir. Örneğin:

Dim arr() As String

Sıfır uzunlukta bir dizi,-1 boyutuyla birlikte bildirilmiştir. Örneğin:

Dim arrZ(-1) As String

Aşağıdaki koşullarda sıfır uzunluklu bir dizi oluşturmanız gerekebilir:

  • bir NullReferenceException özel durumu etkilemeden, kodunuzun Array sınıfının üyelerine veya gibi Length Rank bir Visual Basic işlev çağırmalıdır UBound .

  • Özel bir durum olarak denetlemek zorunda kalmadan kodunuzu basit tutmak istersiniz Nothing .

  • Kodunuz bir veya daha fazla yordamdan sıfır uzunluklu bir diziyi geçirmenize ya da bir veya daha fazla yordamdan sıfır uzunluklu bir dizi döndürmeniz gereken bir uygulama programlama arabirimi (API) ile etkileşime girer.

Diziyi bölme

Bazı durumlarda, tek bir diziyi birden çok diziye bölmeniz gerekebilir. Bu, dizinin bölüneceği nokta veya noktaları tanımlamayı ve sonra diziyi iki veya daha fazla ayrı dizilere Spitting.

Not

Bu bölüm, tek bir dizeyi bir dize dizisine bölme bölümünü bir sınırlayıcı temelinde ele almaz. Bir dizeyi bölme hakkında daha fazla bilgi için, bkz String.Split . yöntemi.

Bir diziyi bölmek için en yaygın ölçütler şunlardır:

  • Dizideki öğelerin sayısı Örneğin, belirtilen sayıda öğeden fazla bir diziyi, yaklaşık olarak eşit sayıda parçaya bölmek isteyebilirsiniz. Bu amaçla, ya da yöntemi tarafından döndürülen değeri kullanabilirsiniz Array.Length Array.GetLength .

  • Dizinin nerede bölüneceği belirten bir sınırlayıcı görevi gören bir öğenin değeri. Ve yöntemlerini çağırarak belirli bir değer için arama yapabilirsiniz Array.FindIndex Array.FindLastIndex .

Dizinin bölünmesi gereken dizin veya dizinleri belirledikten sonra, yöntemini çağırarak ayrı dizileri oluşturabilirsiniz Array.Copy .

Aşağıdaki örnek, bir diziyi yaklaşık olarak eşit boyuttaki iki diziye böler. (Dizi öğelerinin toplam sayısı tek ise, ilk dizide ikinciden daha fazla bir öğe vardır.)


Module Example
   Public Sub Main()
      ' Create an array of 100 elements.
      Dim arr(99) As Integer
      ' Populate the array.
      Dim rnd As new Random()
      For ctr = 0 To arr.GetUpperBound(0)
         arr(ctr) = rnd.Next()
      Next
      
      ' Determine how many elements should be in each array.
      Dim divisor = 2
      Dim remainder As Integer
      Dim boundary = Math.DivRem(arr.GetLength(0), divisor, remainder)
            
      ' Copy the array.
      Dim arr1(boundary - 1 + remainder), arr2(boundary - 1) as Integer
      Array.Copy(arr, 0, arr1, 0, boundary + remainder)
      Array.Copy(arr, boundary + remainder, arr2, 0, arr.Length - boundary) 
   End Sub
End Module

Aşağıdaki örnek, bir dize dizisini değeri "zzz" olan ve dizi sınırlayıcısı görevi gören bir öğe varlığını temel alarak iki diziye ayırır. Yeni diziler, sınırlayıcıyı içeren öğeyi içermez.


Module Example
   Public Sub Main()
      Dim rnd As New Random()
      
      ' Create an array of 100 elements.
      Dim arr(99) As String
      ' Populate each element with an arbitrary ASCII character.
      For ctr = 0 To arr.GetUpperBound(0)
         arr(ctr) = ChrW(Rnd.Next(&h21, &h7F))
      Next
      ' Get a random number that will represent the point to insert the delimiter.
      arr(rnd.Next(0, arr.GetUpperBound(0))) = "zzz"

      ' Find the delimiter.
      Dim location = Array.FindIndex(arr, Function(x) x = "zzz")

      ' Create the arrays.
      Dim arr1(location - 1) As String
      Dim arr2(arr.GetUpperBound(0) - location - 1) As String
      
      ' Populate the two arrays.
      Array.Copy(arr, 0, arr1, 0, location)
      Array.Copy(arr, location + 1, arr2, 0, arr.GetUpperBound(0) - location)
   End Sub
End Module

Dizileri birleştirme

Ayrıca, bir dizi diziyi tek bir daha büyük dizi içinde birleştirebilirsiniz. Bunu yapmak için yöntemini de kullanabilirsiniz Array.Copy .

Not

Bu bölüm, dize dizisinin tek bir dizeye katılmasını tartışır. Bir dize dizisini birleştirme hakkında daha fazla bilgi için, bkz String.Join . yöntemi.

Her bir dizinin öğelerini yeni diziye kopyalamadan önce, diziyi yeni diziye uyum sağlayacak kadar büyük olacak şekilde oluşturduğunuzdan emin olmalısınız. Bunu iki yoldan biriyle yapabilirsiniz:

  • ReDim PreserveYeni öğeleri eklemeden önce diziyi dinamik olarak genişletmek için ifadesini kullanın. Bu en kolay tekniktir, ancak büyük dizileri kopyalarken performans düşüşüne ve aşırı bellek kullanımına neden olabilir.
  • Yeni büyük dizi için gereken toplam öğe sayısını hesaplayın, ardından her kaynak dizisinin öğelerini buna ekleyin.

Aşağıdaki örnek, her biri tek bir diziye on öğe içeren dört dizi eklemek için ikinci yaklaşımı kullanır.

Imports System.Collections.Generic
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim tasks As New List(Of Task(Of Integer()))
      ' Generate four arrays.
      For ctr = 0 To 3
         Dim value = ctr
         tasks.Add(Task.Run(Function()
                               Dim arr(9) As Integer
                               For ndx = 0 To arr.GetUpperBound(0)
                                  arr(ndx) = value
                               Next
                               Return arr
                            End Function))   
       Next
       Task.WaitAll(tasks.ToArray())
       ' Compute the number of elements in all arrays.
       Dim elements = 0
       For Each task In tasks
          elements += task.Result.Length
       Next
       Dim newArray(elements - 1) As Integer
       Dim index = 0
       For Each task In tasks
          Dim n = task.Result.Length
          Array.Copy(task.Result, 0, newArray, index, n)
          index += n
       Next 
      Console.WriteLine($"The new array has {newArray.Length} elements.")
   End Sub
End Module
' The example displays the following output:
'     The new array has 40 elements.

Bu durumda, kaynak dizileri tümüyle küçük olduğundan, her yeni dizinin öğelerini eklediğimiz için diziyi de dinamik olarak genişletebiliriz. Aşağıdaki örnek bunu yapar.

Imports System.Collections.Generic
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim tasks As New List(Of Task(Of Integer()))
      ' Generate four arrays.
      For ctr = 0 To 3
         Dim value = ctr
         tasks.Add(Task.Run(Function()
                               Dim arr(9) As Integer
                               For ndx = 0 To arr.GetUpperBound(0)
                                  arr(ndx) = value
                               Next
                               Return arr
                            End Function))   
       Next
       Task.WaitAll(tasks.ToArray())

       ' Dimension the target array and copy each element of each source array to it.
       Dim newArray() As Integer = {}
       ' Define the next position to copy to in newArray.
       Dim index = 0
       For Each task In tasks
          Dim n = Task.Result.Length
          ReDim Preserve newArray(newArray.GetUpperBound(0) + n)
          Array.Copy(task.Result, 0, newArray, index, n)
          index += n
       Next 
      Console.WriteLine($"The new array has {newArray.Length} elements.")
   End Sub
End Module
' The example displays the following output:
'     The new array has 40 elements.

Dizilere Alternatif olarak Koleksiyonlar

Diziler, kesin olarak belirlenmiş sabit sayıda nesne oluşturmak ve bunlarla çalışmak için en yararlı seçenektir. Koleksiyonlar, nesne gruplarıyla çalışmak için daha esnek bir yol sağlar. ReDim Deyimlebir dizinin boyutunu açıkça değiştirmenizi gerektiren dizilerin aksine koleksiyonlar, bir uygulama değişikliğinin ihtiyaçlarına göre dinamik olarak büyür ve küçülür.

ReDimbir diziyi yeniden dimension yapmak için kullandığınızda, Visual Basic yeni bir dizi oluşturur ve öncekini yayınlar. Bu, yürütme süresini alır. Bu nedenle, çalıştığınız öğe sayısı sıklıkla değişirse veya ihtiyacınız olan en fazla öğe sayısını tahmin edemezsiniz, genellikle bir koleksiyon kullanarak daha iyi performans elde edersiniz.

Bazı koleksiyonlar için, anahtarı kullanarak nesneyi hızlı bir şekilde alabilmeniz için koleksiyona yerleştirdiğiniz herhangi bir nesneye bir anahtar atayabilirsiniz.

Koleksiyonunuz yalnızca bir veri türünün öğelerini içeriyorsa, ad alanındaki sınıflardan birini kullanabilirsiniz System.Collections.Generic . Genel bir koleksiyon, tür güvenliğini, başka bir veri türü eklenememesi için uygular.

Koleksiyonlar hakkında daha fazla bilgi için bkz. koleksiyonlar.

Süre Tanım
Visual Basic'de Dizi Boyutları Dizilerde derecelendirme ve boyutları açıklar.
Nasıl yapılır: Visual Basic'te Dizi Değişkeni Başlatma İlk değerlerle dizilerin nasıl doldurulacağını açıklar.
Nasıl yapılır: Visual Basic'de Bir Diziyi Sıralama Bir dizinin öğelerinin alfabetik olarak nasıl sıralanacağını gösterir.
Nasıl yapılır: Bir Diziyi Başka Diziye Atama Bir diziyi başka bir dizi değişkenine atamaya yönelik kuralları ve adımları açıklar.
Dizilerle İlgili Sorun Giderme Dizilerle çalışırken ortaya çıkan bazı yaygın sorunları açıklar.

Ayrıca bkz.