Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Dizi, mantıksal olarak birbiriyle ilişkili, terim verilen öğ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 englishGrade1
için , englishGrade2
vb. ayrı bir değişken kullanabiliriz. Bu yaklaşımın üç ana 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 verimsiz hale gelir. 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ı ada 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. Bir dizinin indeksleri, 0'dan dizideki toplam öğe sayısının bir eksiğine kadar değişir. Bir dizinin boyutunu tanımlamak için Visual Basic söz dizimini kullandığınızda, dizideki toplam öğe 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 duymamanızı sağlar.
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.
Aşağıdaki örnek, diziyi 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 öğe içeren bir
students
dizi bildirir. Dizi bildirimindeki sayı6
dizideki son dizini gösterir; dizideki öğe sayısından bir küçüktür. - Dizideki her öğeye değer atar. Dizi öğelerine dizi adı kullanılarak ve tek tek öğenin dizini parantez içinde dahil ederek erişilir.
- Dizinin her değerini listeler. Örnek, dizinin her öğesine dizin numarasına göre erişmek için bir
For
deyim kullanır.
students
Önceki örnekteki dizi tek boyutlu bir dizidir çünkü bir dizin kullanır. 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'te 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 dizinin oluşturulduğunda boyutunu belirtmek için
New
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 ReDim
boyutunu yeniden tanımlayabilirsiniz. deyiminin ReDim
dizideki değerleri tuttuğunu veya boş bir dizi oluşturacağını belirtebilirsiniz. Aşağıdaki örnekte, var olan bir dizinin boyutunu değiştirmek için deyiminin farklı kullanımları ReDim
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 Integer
bir dizin kullanarak bir dizideki her konuma erişebilirsiniz. Parantez içine alınmış dizini kullanarak her bir dizi konumuna başvurarak dizideki değerleri depolayabilir ve alabilirsiniz. Çok boyutlu diziler için dizinler virgülle (,) ayrılır. Her dizi boyutu için bir dizin gerekir.
Aşağıdaki örnekte, dizilerdeki değerleri saklayan ve getiren bazı ifadeler 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 sabitleriyle dizi doldurma
Dizi sabit değeri kullanarak, bir diziyi oluştururken ilk değer kümesiyle doldurabilirsiniz. Dizi değişmezleri, köşeli parantezler{}
içinde yer alan ve virgülle ayrılmış bir değerler listesinden oluşur.
Dizi değişmez değerini kullanarak bir dizi oluşturduğunuzda, dizi türünü sağlayabilir 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şletilebileceğ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şmezine sağlanan değerlerin listesi Integer
, Long
, ve Double
türünde değerler içeriyorsa, sonuçta elde edilen dizi Double
türündedir. Çünkü Integer
ve Long
yalnızca Double
‘ye kadar genişletildiğinden, Double
baskın türdür. Daha fazla bilgi için bkz. Genişletme ve Daraltma Dönüştürmeleri.
Uyarı
Tür çıkarımı yalnızca bir tür üyesinde yerel değişkenler 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 türündedir Object[]
. Daha fazla bilgi için bkz. Yerel tür çıkarımı.
Önceki örnekte, values
türünde bir dizi olarak tanımlandığını, tüm dizi değişmez değerlerinin Double
türünde olduğunu ve Integer
türünde olduğunu unutmayın. Dizi sabitindeki değerler Double
değerlerine genişleyebildiği için bu diziyi 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ğerleri 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 dizilerde olduğu gibi, iç içe dizi değişmez değerleriyle çok boyutlu bir dizi oluştururken tür çıkarımına güvenebilirsiniz. Türetilen tür, tüm iç içe yerleştirme düzeyi için tüm dizi ifadelerindeki tüm değerlerin baskın türüdür. Aşağıdaki örnek, Double[,]
ve Integer
türünde değerlerden Double
türünde iki boyutlu bir dizi 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'te Dizi Değişkeni Başlatma.
Bir dizide yineleme
Bir dizide yineleme yaptığınızda, dizideki her öğeye en düşük dizinden en yükseke veya en yüksekten en düşüğe erişirsiniz. Genellikle For... Next Deyimi veya For Each... Next Deyimi kullanarak bir dizinin öğeleri arasında döngü yapabilirsiniz. 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, For...Next
deyimini kullanarak tek boyutlu bir dizide yineler.
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, For...Next
bir deyimi kullanarak çok boyutlu bir dizide yineleme yapar. 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 tek boyutlu bir dizi ve iki boyutlu bir dizi üzerinde yinelemek için For Each...Next Deyimi kullanılır.
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ımları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 bildirir. Örnekte 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
Uyarı
Dizi boyutuyla ilgili bu tartışma, pürüzlü diziler için geçerli değildir. Pürüzlü diziler hakkında bilgi edinmek ve pürüzlü bir dizinin boyutunu belirlemek 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.
Dizi değişkenine yeni bir dizi nesnesi atayarak veya 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 bir büyüktür. |
Uzunluk Sınırları | Bir dizinin her boyutunun uzunluğu, Integer veri türünün maksimum değeri olan (2 ^ 31) - 1 ile 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şlatmaya çalışırsanız, çalışma zamanı bir OutOfMemoryExceptionoluşturur. |
Boyut ve Öğe Boyutu | Bir dizinin boyutu, öğelerinin veri türünden bağımsızdır. Boyut her zaman toplam öğe sayısını temsil eder, bellekte tükettikleri bayt sayısını değil. |
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 bit sistemdekinden 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 derecelendirme sayısına ve dizideki öğelerin veri türüne göre belirlenir. İki dizi değişkeni yalnızca aynı derecelendirmeye 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 sınıfından System.Array devralır ve türünde Array
bir değişken bildirebilirsiniz, ancak türünde Array
bir dizi oluşturamazsınız. Örneğin, aşağıdaki kod arr
değişkenini Array
türünde olarak bildirmesine ve dizi örneği oluşturmak için Array.CreateInstance yöntemini çağırmasına rağmen, dizinin türü Object[] olduğu kanıtlanır.
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,Array
olarak bildirilmiş 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. Type Nesnesi, özellikleri ve yöntemlerinde kapsamlı bilgiler içerir.
- Çalışma zamanı türü adıyla bir TypeName almak için değişkeni
String
işlevine verebilirsiniz.
Aşağıdaki örnek, bir dizinin türünü belirlemek için hem GetType
yöntemini hem de TypeName
işlevini çağırır. Dizi türü şeklindedir Byte(,)
.
Type.BaseType özelliğinin, bayt dizisinin temel türünün Array sınıfı olduğunu da gösterdiğine 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önen değerler 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şlevinde, 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 Sub
yordamının parametresi olarak belirtmek içinFunction
, parametresini belirtilen veri türüne ve boyut sayısına sahip bir dizi olarak tanımlayın. Prosedüre çağrı yaparken, aynı veri türüne ve boyut sayısına sahip bir dizi değişkeni iletin.
Aşağıdaki örnekte, GetNumbers
işlevi, Integer()
türünde tek boyutlu bir Integer
dizisi döndürür. Prosedür 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 Integer(,)
türünde iki boyutlu bir dizi Integer
döndürür. Prosedür 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 ay içindeki gün sayısı tekdüzen değildir. Düzensiz dizi, ayrıca dizilerin dizisi olarak da adlandırılan bu tür senaryolar için tasarlanmıştır. Düzensiz dizi, elemanları da matris 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 örnekte, her öğesi bir gün dizisi olan ay dizisi kullanılır. Farklı ayların gün sayısı farklı olduğundan örnekte pürüzlü bir dizi kullanılır. Örnek, pürüzlü bir dizi oluşturmayı, ona değer atamayı ve değerlerini alıp 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, For...Next
döngüsü kullanılarak düzensiz diziye her bir öğe için değerler atar. İç içe dizi değişmez değerlerini kullanarak da 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ı 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
Dikdörtgensel olmayan dizi, öğeleri kendi içinde 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 dizinin özelliğinin Array.Length değerini alarak belirlersiniz. Aşağıdaki örnekte, pürüzlü bir 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 Nothing
olan bir dizi) ile sıfır uzunluklu bir dizi veya boş dizi (öğe içermeyen bir dizi) arasında ayrım gerçekleştirir. Başlatılmamış bir dizi, boyutlanmamış veya kendisine herhangi bir değer atanmamış olan dizidir. Örneğin:
Dim arr() As String
-1 boyutuyla sıfır uzunluklu bir dizi bildirilir. Örneğin:
Dim arrZ(-1) As String
Aşağıdaki koşullarda sıfır uzunluklu bir dizi oluşturmanız gerekebilir:
Özel NullReferenceException durum riski olmadan kodunuzun Array sınıfın üyelerine, Length veya Rank gibi, erişmesi veya UBound gibi bir Visual Basic işlevi çağırması gerekiyor.
Özel bir durum için
Nothing
kontrol etme gerekliliği olmadan 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ürmeyi içerir.
Uyarı
Bu bölüm, tek bir dizeyi bazı sınırlayıcılara göre bir dize dizisine bölmeyi ele almaz. 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 fazla öğeden oluşan bir diziyi yaklaşık eşit parça sayısına bölmek isteyebilirsiniz. Bu amaçla, Array.Length veya Array.GetLength yönteminden 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. Array.FindIndex ve Array.FindLastIndex yöntemlerini çağırarak 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 eşit boyutta iki diziye böler. (Eğer dizi öğelerinin toplam sayısı tekse, ilk dizi ikinciden bir öğe daha fazla içerir.)
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 Array.Copy yöntemini de kullanırsınız.
Uyarı
Bu bölüm, bir dize dizisini tek bir dizeye birleştirmeyi tartışmaz. 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 ve 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 eklerken 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 türü belirlenmiş 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. Dizilerin boyutunu ReDim
ifadesiyle açıkça değiştirmenizi gerektiren durumların aksine, koleksiyonlar uygulama gereksinimleri değiştikçe dinamik olarak büyür ve küçülür.
Bir diziyi yeniden boyutlandırmak için ReDim
kullandığınızda, 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ızla alabilmeniz için koleksiyona eklediğ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 veri türlerinin eklenememesi için tür güvenliğini zorlar.
Koleksiyonlar hakkında daha fazla bilgi için bkz. Koleksiyonlar.
İlgili konular
Süre | Tanım |
---|---|
Visual Basic'te Dizi Boyutları | Dizilerdeki derecelendirmeyi 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'te Dizi Sıralama | Bir dizinin öğelerini alfabetik olarak sıralamayı gösterir. |
Nasıl yapılır: Bir Diziyi Başka Bir Diziye Atama | Bir diziyi başka bir dizi değişkenine atama kurallarını ve adımlarını açıklar. |
Dizilerle İlgili Sorunları Giderme | Dizilerle çalışırken ortaya çıkan bazı yaygın sorunları açıklar. |