Menu

C# Dizi (Array): Tanımlama, Length, Sıralama, 2D ve Jagged Diziler

Bir C# dizisi, tek tipte elemanlardan oluşan sabit boyutlu bir bloktur. Dizileri tanımlamayı ve başlatmayı, Length'i okumayı, Array sınıfıyla sıralamayı ve aramayı, onları güvenle kopyalamayı ve 2D ile jagged dizilerle çalışmayı öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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>
BoyutOluşturulurken sabitlenirBüyür ve küçülür
SayıLength property'siCount property'si
Ekleme ya da silmeMümkün değil (yalnızca Array.Resize)Add, Insert, Remove
Çok boyutlu[,] ve [][]Yalnızca listelerden oluşan listeler
Tipik kullanımBilinen boyut, arama tabloları, tamponlarDeğ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 indeks Length - 1'dir; bu IndexOutOfRangeException fırlatır.
  • Diziyi doğrudan yazdırmak. Console.WriteLine(arr) System.Int32[] yazdırır; string.Join kullanın.
  • Array.Sort'un sıralı diziyi döndürmesini beklemek. void döndürür ve yerinde sıralar.
  • = ile kopyalamak. Bu referansı kopyalar; Clone() ya da ToArray() kullanın.
  • Jagged satırları oluşturmadan kullanmak. new T[n][]'nin her satırı atanana kadar null'dır.
  • 2D bir dizinin satırları için Length kullanmak. 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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA