Visual Basic'de Diziler

Dizi, mantıksal olarak birbiriyle ilişkili, terimi belirlenmiş öğeler olan bir değer kümesidir. Örneğin, bir dizi bir dil bilgisi okulundaki her sınıftaki öğrenci sayısından oluşabilir; dizinin her öğesi, tek bir sınıftaki öğrenci sayısıdır. Benzer şekilde, bir dizi öğrencinin sınıf notlarından oluşabilir; dizinin her öğesi tek bir sınıftır.

Veri öğelerimizin her birini depolamak için tek tek değişkenleri kullanmak mümkündür. Örneğin, uygulamamız öğrenci notlarını analiz ederse, her öğrencinin notu englishGrade1için , englishGrade2vb. ayrı bir değişken kullanabiliriz. Bu yaklaşımın üç önemli sınırlaması vardır:

  • Tasarım zamanında tam olarak kaç nota ihtiyacımız olduğunu bilmemiz gerekir.
  • Çok sayıda notun işlenmesi hızla zorlaşır. Bu da bir uygulamanın ciddi hatalara sahip olma olasılığını çok daha yüksek hale getirir.
  • Bakımı zor. Eklediğimiz her yeni not için uygulamanın değiştirilmesi, yeniden derlenip yeniden dağıtılması gerekir.

Dizi kullanarak, bu ilgili değerlere aynı adla başvurabilir ve dizideki konumuna göre tek bir öğeyi tanımlamak için dizin veya alt simge olarak adlandırılan bir sayı kullanabilirsiniz. Dizinin dizinleri, dizideki öğelerin toplam sayısından 0 ile bir arasında değişir. Bir dizinin boyutunu tanımlamak için Visual Basic söz dizimini kullandığınızda, dizideki öğelerin toplam sayısını değil, en yüksek dizinini belirtirsiniz. Diziyle bir birim olarak çalışabilirsiniz ve öğelerini yineleme özelliği, tasarım zamanında tam olarak kaç öğe içerdiğini bilmenize gerek duymanızı engeller.

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(,) {{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 dizideki dizi öğeleri

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

Aşağıdaki çizimde dizi gösterilmektedir students . Dizinin her öğesi için:

  • öğesinin dizini notu temsil eder (dizin 0 anaokulu temsil eder).

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

Diagram showing an array of the numbers of students

Aşağıdaki örnek, dizisini oluşturan ve kullanan Visual Basic kodunu 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 öğeli bir students dizi bildirir. Dizi bildirimindeki sayı 6 dizideki son dizini gösterir; dizideki öğelerin sayısından bir küçüktür.
  • Dizideki her öğeye değer atar. Dizi öğelerine, dizi adı kullanılarak ve tek öğenin dizini parantez içinde dahil ederek erişilir.
  • Dizinin her değerini listeler. Örnekte dizinin her öğesine dizin numarasına göre erişmek için bir For deyimi kullanılır.

students Bir dizin kullandığından, önceki örnekteki dizi tek boyutlu bir dizidir. Birden fazla dizin veya alt simge kullanan bir dizi , çok boyutlu olarak adlandırılır. Daha fazla bilgi için bu makalenin geri kalanına ve Visual Basic'de Dizi Boyutları'na bakın.

Dizi oluşturma

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

  • Dizi bildirildiğinde boyutu belirtebilirsiniz:

    ' 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 oluşturulduğunda boyutunu sağlamak için bir yan tümcesi kullanabilirsiniz New :

    ' 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 ReDim boyutunu yeniden tanımlayabilirsiniz. deyiminin ReDim dizideki değerleri tutmasını veya boş bir dizi oluşturmasını belirtebilirsiniz. Aşağıdaki örnekte, deyiminin ReDim var olan bir dizinin boyutunu değiştirmek için farklı kullanımları gösterilmektedir.

' 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 bir dizide depolama

türünde Integerbir dizin kullanarak bir dizideki her konuma erişebilirsiniz. Parantez içine alınmış dizinini kullanarak her dizi konumuna başvurarak bir dizideki değerleri depolayabilir 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 örnekte, dizilerdeki değerleri depolayan ve alan bazı deyimler gösterilmektedir.


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 değişmez değerleriyle dizi doldurma

Bir dizi değişmez değeri kullanarak, bir diziyi oluştururken ilk değer kümesiyle doldurabilirsiniz. Dizi değişmez değeri, küme ayraçları (){} içine alınmış virgülle ayrılmış değerlerin bir listesinden oluşur.

Dizi değişmez değerini kullanarak bir dizi oluşturduğunuzda, dizi türünü sağlamak veya dizi türünü belirlemek için tür çıkarımı kullanabilirsiniz. Aşağıdaki örnekte her iki seçenek de gösterilmektedir.

' 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ımı kullandığınızda, dizinin türü değişmez değerler listesindeki baskın tür tarafından belirlenir. Baskın tür, dizideki diğer tüm türlerin genişletebileceği türdür. Bu benzersiz tür belirlenemezse, baskın tür dizideki diğer tüm türlerin daraltabileceği benzersiz türdür. Bu benzersiz türlerden hiçbiri belirlenemezse, baskın tür olur Object. Örneğin, dizi değişmez değerine sağlanan değerlerin listesi , ve türünde Integerdeğerler içeriyorsa, sonuçta elde edilen dizi türündedirDouble.DoubleLong Çünkü Integer ve Long yalnızca olarak DoubleDouble genişletilir, baskın türdür. Daha fazla bilgi için bkz. Genişletme ve Daraltma Dönüştürmeleri.

Not

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

Önceki örnekte, tüm dizi değişmez Integerdeğerleri türünde Double olsa bile bir tür dizisi olarak tanımlandığını values unutmayın. Dizi değişmez değerindeki değerler değerlere genişleyebildiğinden bu diziyi Double oluşturabilirsiniz.

ayrıca iç içe dizi değişmez değerlerini kullanarak çok boyutlu bir dizi oluşturabilir ve doldurabilirsiniz. İç içe dizi değişmez değerleri, sonuçta elde edilen diziyle tutarlı olan bir dizi boyuta sahip olmalıdır. 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}}

Dizi oluşturmak ve doldurmak için iç içe dizi değişmez değerleri kullanılırken, iç içe dizi değişmez değerlerindeki öğelerin sayısı eşleşmiyorsa bir hata oluşur. Dizi değişkenini dizi değişmez değerlerinden farklı sayıda boyuta sahip olacak şekilde açıkça bildirirseniz de hata oluşur.

Tek boyutlu diziler için yapabileceğiniz gibi, iç içe dizi değişmez değerleriyle çok boyutlu bir dizi oluştururken tür çıkarımına güvenebilirsiniz. Çıkarsanan tür, tüm iç içe yerleştirme düzeyi için tüm dizi değişmez değerlerindeki tüm değerler için baskın türdür. Aşağıdaki örnek, ve Doubletüründe Double[,] olan değerlerden iki boyutlu bir tür dizisi Integer oluşturur.

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

Ek örnekler için bkz. Nasıl yapılır: Visual Basic'de Dizi Değişkeni Başlatma.

Dizide yineleme

Bir dizide yineleme yaptığınızda, dizideki her öğeye en düşük dizinden en yükseğe veya en yüksekten en düşüğe erişirsiniz. Genellikle For... Sonraki Deyim veya Her İçin... Bir dizinin öğeleri arasında yineleme yapmak için Next Deyimi. Dizinin üst sınırlarını bilmediğiniz zaman, dizinin en yüksek değerini almak için yöntemini çağırabilirsiniz Array.GetUpperBound . En düşük dizin değeri neredeyse her zaman 0 olsa da, dizinin en düşük değerini almak için yöntemini çağırabilirsiniz Array.GetLowerBound .

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


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 For...Next kullanarak çok boyutlu bir dizide yinelenir. yöntemi, GetUpperBound boyutu belirten bir parametreye sahiptir. GetUpperBound(0) birinci boyutun en yüksek dizinini döndürür 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 For Each... Bir boyutlu dizi ve iki boyutlu dizide yinelemek 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 çarpımını ifade eder. Dizide bulunan öğelerin toplam sayısını temsil eder. Örneğin, aşağıdaki örnek her boyutta dört öğe içeren 2 boyutlu bir dizi bildirir. Örnekteki çıktıda gösterildiği gibi dizinin boyutu 16 (veya (3 + 1) * (3 + 1) şeklindedir.


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

Bu dizi boyutu tartışması, pürüzlü diziler için geçerli değildir. Pürüzlü diziler ve pürüzlü bir dizinin boyutunu belirleme hakkında bilgi için , Pürüzlü diziler bölümüne bakın.

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

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


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 ilgilenirken göz önünde bulundurulması gereken birkaç şey vardır.

Notlar
Boyut Uzunluğu Her boyutun dizini 0 tabanlıdır, yani 0 ile üst sınırı arasında değişir. Bu nedenle, belirli bir boyutun uzunluğu, bu boyutun bildirilen üst sınırından büyüktür.
Uzunluk Sınırları Bir dizinin her boyutunun uzunluğu, veya (2 ^ 31) - 1 olan Int32.MaxValue veri türünün en büyük değeriyle Integer sınırlıdır. Ancak, bir dizinin toplam boyutu da sisteminizdeki kullanılabilir bellekle sınırlıdır. Kullanılabilir bellek miktarını aşan bir dizi başlatmayı denerseniz, çalışma zamanı bir OutOfMemoryExceptionoluşturur.
Boyut ve Öğe Boyutu 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ığıyla ilgili varsayımlarda bulunmak güvenli değildir. Depolama farklı veri genişliklerindeki platformlara göre değişiklik gösterir, bu nedenle aynı dizi 64 bit sistemde 32 bitlik bir sistemden daha fazla bellek tüketebilir. Bir diziyi başlatırken sistem yapılandırmasına bağlı olarak, ortak dil çalışma zamanı (CLR) öğeleri mümkün olduğunca birbirine yakın bir şekilde paketlemek veya tümünü doğal donanım sınırlarına hizalamak için depolama atayabilir. Ayrıca, bir dizi denetim bilgileri için bir depolama yükü gerektirir ve eklenen her boyutla birlikte bu ek yük artar.

Dizi türü

Her dizi, öğelerinin veri türünden farklı bir veri türüne sahiptir. Tüm diziler için tek bir veri türü yoktur. Bunun yerine, bir dizinin veri türü, dizinin boyut veya derece sayısına ve dizideki öğelerin veri türüne göre belirlenir. İki dizi değişkeni yalnızca aynı derecelendirmeye sahip olduğunda 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 sınıfından System.Array devralır ve türünde bir değişken Arraybildirebilirsiniz, ancak türünde Arraybir dizi oluşturamazsınız. Örneğin, aşağıdaki kod değişkenin arr türünde Array olduğunu bildirse ve dizi örneği oluşturmak için yöntemini çağırsa Array.CreateInstance da, dizinin türünün Object[] olduğu kanıtlanabilir.


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 Deyimi türü Arrayolarak bildirilen bir değişken üzerinde çalışamaz. Bu nedenlerle ve tür güvenliği için her diziyi belirli bir tür olarak bildirmeniz önerilir.

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

  • değişkeninin GetType çalışma zamanı türünü temsil eden bir Type nesne almak için değişkende yöntemini çağırabilirsiniz. Nesnesi Type , özellikleri ve yöntemlerinde kapsamlı bilgiler barındırıyor.
  • Çalışma zamanı türü adıyla bir String almak için değişkeni TypeName işleve geçirebilirsiniz.

Aşağıdaki örnek, bir dizinin türünü belirlemek için hem yöntemini hem TypeName de GetType işlevini çağırır. Dizi türü şeklindedir Byte(,). özelliğinin Type.BaseType bayt dizisinin temel türünün sınıfı olduğunu da gösterdiğine Array dikkat edin.


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 parametreler olarak diziler

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

Bir diziyi veya yordamının parametresi olarak belirtmek için SubFunction , parametreyi belirtilen veri türüne ve boyut sayısına sahip bir dizi olarak tanımlayın. Yordam ç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şlevi türünde Integertek Integer()boyutlu bir dizi döndürür. Yordam ShowNumbers 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 türünde Integeriki boyutlu bir dizi döndürürInteger(,). Yordam ShowNumbersMultiDim 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

Pürüzlü diziler

Bazen uygulamanızdaki veri yapısı iki boyutludur ancak dikdörtgen değildir. Örneğin, ayın her gününün yüksek sıcaklığıyla ilgili verileri depolamak için bir dizi kullanabilirsiniz. Dizinin ilk boyutu ayı temsil eder, ancak ikinci boyut gün sayısını temsil eder ve bir aydaki gün sayısı tekdüzen değildir. Dizi dizisi 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 dizi olan bir dizidir. Pürüzlü bir dizi ve bir pürüzlü dizideki her öğe bir veya daha fazla boyuta sahip olabilir.

Aşağıdaki örnek, her öğesi bir gün dizisi olan ay dizisini kullanır. Farklı ayların gün sayısı farklı olduğundan örnekte tırtıklı bir dizi kullanılır. Örnekte, pürüzlü bir dizi oluşturma, diziye değer atama ve değerlerini alma ve görüntüleme işlemleri gösterilmektedir.

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, döngü kullanarak For...Next öğelerine göre bir öğe temelinde pürüzlü diziye değerler atar. İç içe dizi değişmez değerlerini kullanarak da pürüzlü bir dizinin öğelerine değer 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ı BC30568 oluşturur. Hatayı düzeltmek için iç dizi değişmez değerlerini parantez içine alın. Parantezler dizi değişmez değerinin değerlendirilmesini zorlar ve elde edilen değerler aşağıdaki örnekte gösterildiği gibi dış dizi değişmez değeriyle 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

Pürüzlü 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 dizi çok boyutlu olmadığından bir IndexOutOfRangeException oluşturur. Her alt dizideki öğelerin sayısını, her alt dizi özelliğinin Array.Length değerini alarak belirlersiniz. Aşağıdaki örnekte, bir pürüzlü dizideki öğelerin sayısını belirleme işlemi gösterilmektedir.


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 Nothingolan bir dizi) ile sıfır uzunluklu dizi veya boş dizi (öğe içermeyen bir dizi) arasında ayrım gerçekleştirir. Başlatılmamış dizi, boyutlanmamış veya kendisine herhangi bir değer atanmamış dizidir. Örneğin:

Dim arr() As String

Sıfır uzunluklu bir dizi -1 boyutuyla bildirilir. Örneğin:

Dim arrZ(-1) As String

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

  • Özel durum NullReferenceException riski olmadan kodunuzun veya Rankgibi Length sınıfın üyelerine Array erişmesi veya gibi UBoundbir Visual Basic işlevi çağırması gerekir.

  • Özel durum denetimi yapmak zorunda kalmadan Nothing kodunuzu basit tutmak istiyorsunuz.

  • Kodunuz, bir veya daha fazla yordama sıfır uzunluklu bir dizi geçirmenizi gerektiren veya bir veya daha fazla yordamdan sıfır uzunluklu bir dizi döndüren bir uygulama programlama arabirimi (API) ile etkileşim kurar.

Diziyi bölme

Bazı durumlarda, tek bir diziyi birden çok diziye bölmeniz gerekebilir. Bu, dizinin bölündüğü noktayı veya noktaları tanımlamayı ve ardından diziyi iki veya daha fazla ayrı diziye tükürüp atmayı içerir.

Not

Bu bölümde, tek bir dizenin bir sınırlayıcı temelinde bir dize dizisine bölünmesi ele alınmaz. Bir dizeyi bölme hakkında bilgi için yöntemine String.Split bakın.

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

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

  • Dizinin bölünmesi gereken yeri belirten bir sınırlayıcı işlevi görecek bir öğenin değeri. ve Array.FindLastIndex yöntemlerini çağırarak Array.FindIndex belirli bir değeri arayabilirsiniz.

Dizinin bölünmesi gereken dizini veya dizinleri belirledikten sonra yöntemini çağırarak Array.Copy tek tek diziler oluşturabilirsiniz.

Aşağıdaki örnek, bir diziyi yaklaşık olarak eşit boyutta iki diziye böler. (Dizi öğelerinin toplam sayısı tekse, ilk dizi ikinciden bir fazla öğeye sahiptir.)


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, değeri "zzz" olan ve dizi sınırlayıcısı işlevi görecek bir öğenin varlığına bağlı olarak bir dize dizisini iki diziye böler. 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 sayısını tek bir daha büyük dizide birleştirebilirsiniz. Bunu yapmak için yöntemini de kullanırsınız Array.Copy .

Not

Bu bölümde, bir dize dizisinin tek bir dizede birleştirilmesi ele alınmaz. Bir dize dizisini birleştirme hakkında bilgi için yöntemine String.Join bakın.

Her dizinin öğelerini yeni diziye kopyalamadan önce, diziyi yeni diziyi barındıracak kadar büyük olacak şekilde başlatmış olduğunuzdan emin olmanız gerekir. Bunu iki yoldan biriyle yapabilirsiniz:

  • ReDim Preserve Yeni öğeler eklemeden önce diziyi dinamik olarak genişletmek için deyimini kullanın. Bu en kolay tekniktir, ancak büyük dizileri kopyalarken performans düşüşü ve aşırı bellek tüketimine neden olabilir.
  • Yeni büyük dizi için gereken toplam öğe sayısını hesaplayın, ardından her kaynak dizinin öğ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 dizilerin tümü küçük olduğundan, her yeni dizinin öğelerini eklediğimizde diziyi 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 en çok sabit sayıda kesin olarak yazılan nesne oluşturmak ve bunlarla çalışmak için kullanışlıdır. Koleksiyonlar, nesne gruplarıyla çalışmak için daha esnek bir yol sağlar. DeyimiyleReDim bir dizinin boyutunu açıkça değiştirmenizi gerektiren dizilerden farklı olarak, koleksiyonlar bir uygulamanın gereksinimleri değiştikçe dinamik olarak büyür ve küçültülür.

bir diziyi yeniden soluklaştırmak için kullandığınızdaReDim, Visual Basic yeni bir dizi oluşturur ve öncekini serbest bırakır. Bu işlem yürütme süresini alır. Bu nedenle, üzerinde çalıştığınız öğelerin sayısı sık sık değişiyorsa veya ihtiyacınız olan en fazla öğe sayısını tahmin edemiyorsanız, 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 anahtar atayabilirsiniz.

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

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

Süre Tanım
Visual Basic'de Dizi Boyutları Dizilerdeki sıralamayı ve boyutları açıklar.
Nasıl yapılır: Visual Basic'te Dizi Değişkeni Başlatma Dizileri ilk değerlerle doldurmayı açıklar.
Nasıl yapılır: Visual Basic'de Bir Diziyi Sıralama Bir dizinin öğelerini alfabetik olarak sıralamayı gösterir.
Nasıl yapılır: Bir Diziyi Başka Diziye Atama Bir diziyi başka bir dizi değişkenine atama kurallarını ve adımlarını açıklar.
Dizilerle İlgili Sorun Giderme Dizilerle çalışırken ortaya çıkan bazı yaygın sorunları açıklar.

Ayrıca bkz.