Bir dizi, tek tipte sabit sayıda elemanı bellekte yan yana saklar. Uzunluğu oluştururken seçersiniz, elemanları sıfır tabanlı bir indeksle okuyup yazarsınız ve uzunluk bundan sonra asla değişmez.
Bir diziyi tanımlamak ve başlatmak
Bir dizinin tipi, eleman tipinin ardından gelen []'dir. Bir dizi oluşturmanın birkaç yolu vardır:
Çıktı:
90, 0, 0, 72
Ben
2 prices, 3 days
new int[4] her elemanı tipin varsayılan değeriyle doldurur: sayılar için 0, bool için false, string'ler ve diğer referans tipleri için null. Kısa biçim { "Ana", "Ben" } yalnızca bir bildirimde çalışır; mevcut bir değişkene atarken names = new[] { "Dev", "Eli" }; gerekir.
Length, indeksleme ve son eleman
İndeksler 0'dan Length - 1'e kadardır. Length bir property'dir, bu yüzden parantezi yoktur (LINQ'in Count() metodunun aksine).
Çıktı:
Count: 5
First: 18
Last: 16
Caught IndexOutOfRangeException
Sınırların dışında okumak ya da yazmak çalışma zamanında IndexOutOfRangeException fırlatır; derleyici bunu yakalamaz. Olağan neden, i < arr.Length yerine i <= arr.Length olarak yazılmış bir döngü koşuludur.
C# 8 ve sonrası, son eleman ve dilimler için daha kısa olan sondan indeks ve aralık sözdizimini ekler:
int last = temps[^1]; // 16
int[] middle = temps[1..4]; // { 21, 25, 19 }, a new array
Bir dizi üzerinde döngü
Bir for döngüsü size indeksi verir; foreach her elemanı verir ve yalnızca okurken daha anlaşılır seçimdir.
Çıktı:
4.95 | 13.20 | 3.58
Total: 21.73
foreach değişkeni salt okunurdur: döngünün içinde p = 0; bir derleme hatasıdır. Elemanları değiştirmek için indeksle dönün.
Sıralamak, ters çevirmek ve aramak
Yardımcılar statik Array sınıfındadır. Array.Sort yerinde sıralar ve hiçbir şey döndürmez, bu yüzden orijinal sıra kaybolur.
Çıktı:
Ascending: 60, 72, 79, 88, 95
Descending: 95, 88, 79, 72, 60
Index of 60: 4
Index of 99: -1
Any above 90: True
First below 75: 72
Ana, ben, chloe
fig, kiwi, banana
Array.IndexOf değer yoksa -1 döndürür. Array.Find hiçbir şey eşleşmediğinde tipin varsayılan değerini (burada 0) döndürür; bu sayılar için belirsizdir, önemli olduğunda Array.FindIndex kullanın. Tek çağrıda azalan sıralama Array.Sort(scores, (a, b) => b.CompareTo(a))'dır.
Orijinale dokunmadan sıralı sonuca ihtiyacınız varsa LINQ yeni bir dizi döndürür: var sorted = scores.OrderBy(s => s).ToArray();. Bkz. LINQ.
Yeniden boyutlandırma: bir dizi büyüyemez
Uzunluk sabittir. Array.Resize istenen boyutta yeni bir dizi oluşturur, elemanları kopyalar ve ref ile geçirdiğiniz değişkeni günceller.
Çıktı:
4
2
True
False
Her yeniden boyutlandırma her elemanı kopyalar. Bir diziyi döngüde teker teker büyütmek yavaştır ve List<T>'nin iç dizisini ikiye katlayarak sizin için daha verimli yaptığı şey tam olarak budur.
Diziler referans tipleridir: kopyalama
Bir diziyi başka bir değişkene atamak elemanları değil referansı kopyalar. Bundan sonra iki ad da aynı diziyi gösterir.
Çıktı:
100
2
0, 100, 2, 3, 0
Aynısı bir diziyi bir metoda geçirdiğinizde de geçerlidir: metot çağıranın elemanlarını değiştirebilir. Clone, Array.Copy, CopyTo ve LINQ'in ToArray()'i hepsi sığ bir kopya yapar. Nesnelerden oluşan bir dizi için yeni dizi aynı nesnelere referanslar tutar, bu yüzden copy[0].Name'i değiştirmek original[0]'ın gördüğünü de değiştirir.
Dizileri == ile karşılaştırmak referansları karşılaştırır. İçerikleri karşılaştırmak için System.Linq'teki a.SequenceEqual(b)'yi kullanın.
2D diziler (çok boyutlu)
Dikdörtgen bir ızgara köşeli parantezlerin içinde bir virgülle bildirilir. Onu [row, col] ile indeksleyin.
Çıktı:
Rows: 2
Cols: 3
Length: 6, Rank: 2
. X .
. . X
2D bir dizide Length toplam eleman sayısıdır (2'ye 3'lük bir ızgara için 6); iç içe döngülerin GetLength(0) ve GetLength(1) kullanmasının nedeni budur. Rank boyut sayısıdır. Üç boyut aynı şekilde çalışır: new int[4, 4, 4] ve cube[x, y, z]. 2D bir dizi üzerindeki foreach her elemanı satır satır ziyaret eder.
Jagged diziler (dizilerden oluşan diziler)
Jagged bir dizi int[][], elemanları kendileri dizi olan bir dizidir ve her iç dizinin kendi uzunluğu olabilir. Satırların boyutlarının farklı olduğu "müşteri başına siparişler" gibi verilere uyar.
Çıktı:
Customer 0: 2 orders, 20, 35
Customer 1: 1 orders, 12
Customer 2: 4 orders, 8, 15, 40, 22
True
new int[3][] yalnızca dış diziyi oluşturur; her satır null olarak başlar ve bir satır atamadan önce orders[0][0] NullReferenceException fırlatır. new int[3][4] sözdizimine izin verilmez; her satırı kendiniz oluşturursunuz.
Gerçek bir ızgara için (bir tahta, bir matris, pikseller) [,], satırların uzunlukları farklıysa ya da tüm satırları değiştirmek istiyorsanız [][] kullanın.
Dizi ile List
Dizi T[] | List<T> | |
|---|---|---|
| Boyut | Oluşturulurken sabitlenir | Büyür ve küçülür |
| Sayı | Length property'si | Count property'si |
| Ekleme ya da silme | Mümkün değil (yalnızca Array.Resize) | Add, Insert, Remove |
| Çok boyutlu | [,] ve [][] | Yalnızca listelerden oluşan listeler |
| Tipik kullanım | Bilinen boyut, arama tabloları, tamponlar | Değişen koleksiyonlar |
Dönüştürmek her iki yönde de tek bir çağrıdır: new List<int>(arr) ya da arr.ToList() ve list.ToArray(). List<T> büyüyebilen sürümdür.
Yaygın hatalar
- Bir döngüde
i <= arr.Length. Son geçerli indeksLength - 1'dir; buIndexOutOfRangeExceptionfırlatır. - Diziyi doğrudan yazdırmak.
Console.WriteLine(arr)System.Int32[]yazdırır;string.Joinkullanın. Array.Sort'un sıralı diziyi döndürmesini beklemek.voiddöndürür ve yerinde sıralar.=ile kopyalamak. Bu referansı kopyalar;Clone()ya daToArray()kullanın.- Jagged satırları oluşturmadan kullanmak.
new T[n][]'nin her satırı atanana kadarnull'dır. - 2D bir dizinin satırları için
Lengthkullanmak. Her elemanı sayar;GetLength(0)kullanın.
Sıkça Sorulan Sorular
C#'ta bir dizinin uzunluğu nasıl alınır?
Length property'sini kullanın: scores.Length. Metot değil property'dir, bu yüzden parantez yoktur. 2D bir dizide Length toplam eleman sayısıdır; satır sayısı için GetLength(0), sütun sayısı için GetLength(1) kullanın.
C#'ta bir dizi nasıl sıralanır?
Array.Sort(arr) diziyi yerinde artan sırada sıralar. Azalan sıra için sıraladıktan sonra Array.Reverse(arr) çağırın ya da bir karşılaştırma verin: Array.Sort(arr, (a, b) => b.CompareTo(a)). Orijinali koruyarak sıralı bir kopya almak için LINQ kullanın: arr.OrderBy(x => x).ToArray().
C#'ta 2D dizi ile jagged dizi arasındaki fark nedir?
2D bir dizi int[,] tek bir dikdörtgen bloktur: her satırın aynı sayıda sütunu vardır ve onu grid[row, col] olarak indekslersiniz. Jagged bir dizi int[][] dizilerden oluşan bir dizidir: her satır kendi uzunluğu olabilen ayrı bir dizidir ve onu rows[i][j] olarak indekslersiniz. Jagged bir dizinin her satırı kullanılmadan önce oluşturulmalıdır, yoksa null'dır.
C#'ta bir dizinin boyutu değiştirilebilir mi?
Hayır. Bir dizinin uzunluğu oluşturulduğunda sabitlenir. Array.Resize(ref arr, newSize) boyutu değiştiriyormuş gibi görünür, ama yeni bir dizi ayırır, elemanları kopyalar ve değişkeninizi yeni diziye yönlendirir. Boyut sık değişiyorsa bir List<T> kullanın.
Bir diziyi yazdırmak neden System.Int32[] gösteriyor?
Console.WriteLine(arr) arr.ToString()'i çağırır ve diziler onu override etmez, bu yüzden tip adını alırsınız. Bunun yerine elemanları tek bir string'de birleştirin: Console.WriteLine(string.Join(", ", arr)).
C#'ta dizi mi kullanmalıyım, List mi?
Eleman sayısı bilinen ve sabitse, örneğin 12 ay ya da bir oyun tahtası gibi, dizi kullanın. Elemanlar zamanla eklenip çıkarılıyorsa List<T> kullanın. İkisi de sabit zamanda indekslenir ve bir List<T> elemanlarını içeride bir dizide saklar.