Anasayfa / Yazılım / C# / İki (Çok) Boyutlu Diziler

İki (Çok) Boyutlu Diziler

Çok boyutlu diziler daha çok satır ve sütunlar şeklinde oluşturulmuş veri kümelerindeki bilgileri saklamak için kullanılırlar. Örneğin iki boyutlu bir dizi tanımlama için dizi tanımlama esnasında hem satır hem de sütun bilgisini veririz. Burada dizi indisi tanımlama aşamasında ilk verilen değer satırı temsil eder, ikinci verilen değer sütunu temsil eder. Tabi çok boyutlu denilince akla sadece iki boyutlu diziler gelmesin, 2 boyuttan çok daha fazla boyutta dizilerde oluşturulabilir, her ne kadar pek kullanma ihtiyacımız olmasa da bu mümkündür. Ben bu yazımda sadece 2 boyutlu diziler ile alakalı işlemler yapacağım. c#’da iki boyutlu dizilerin iki tipi mevcuttur. Bunları global isimleri ile anacak olursak, birisi rectangular array, bir diğeri de jagged array olarak anılır.

Rectangular Arrays : Bu tipteki diziler satırlar ve sütunlar şeklinde bilgi içeren tablo şeklindeki verileri saklamak için kullanılır. Örnek olarak aşağıda 3 satır ve 4 sütundan oluşan bir yapıyı resmettik.

2014033101

Bu yapıda dizimizin adı a. a dizisinde tanımlanan ilk rakam yani ilk indeks satır indeksini verir. İkinci indeks ise sütun indeksini verir.

Şimdi iki boyutlu bir dizi nasıl tanımlanıyor bunu yazalım.

int[ , ] a = { { 10, 20 }, { 30, 40 } };

Normal dizi tanımlamada olduğu gibi önce dizinin tipi sonra iki köşeli parantez kullanıyoruz. İki boyutlu dizi olacağı için bir boşluk, bir virgül ve bir boşluk mevcut, yani virgül öncesi ve sonrası birer değer gelecek demek bu aslında. Dolayısı ile tek virgül olması nedeni ile 2 boyutlu bir dizi. Şöyle olsaydı [ , , ] Bu sefer 3 boyutlu olurdu gibi düşünün. Daha sonra her bir elemanımı köşeli parantez içinde yazıyorum. Tabi burda bi dikkat edilmesi gereken nokta da şu, dış köşe prantezin içinde her bir ayrı eleman için de kendi içinde köşeli parantez mevcut. {10,20} gibi.. { {10,20}, {30,40} } şeklinde oluyor yani..

Jagged Arrays: Jagged diziler daha esnek yapıdaki dizilerdir. Örnek bir oluşturma şekli aşağıdaki gibidir.

int[][] jagged = { new int[] { 1, 2 },
new int[] { 3 },
new int[] { 4, 5, 6 } };

Böyle bir yapıyı nerede kullanabiliriz kısmına örnek verirsek, örneğin diyelim ki bir öğrencinin notları belli bir dizi içinde saklanacak. Bazı derslerden bir öğrenci 2 not alır, bazısından tek not alır, bazısından 3 not alır. Ama bu notların hepsi aynı öğrenciye aittir. İşte bu gibi durumlarda jagged diziler işimize yaramaktadır. Yani esnek bir yapıya sahiptir. Dolayısı ile esnek bir şekilde eleman saklayabilme ihtimali sunarlar.

Şimdi hem rectangular hem de jagged array kullanımı ile alakalı bir örnek yapalım. Console uygulaması açıyorum ve aşağıdaki şekilde kodlarımı yazıyorum. Açıklamalarım da kodlarımın içinde.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication23
{
    class Program
    {
        static void Main(string[] args)
        {
            //Her kolonun aynı uzunluğa sahip olduğu rectangular dizi oluşturuyorum
            int[,] rectangularDizi = { { 1, 2, 3 }, { 4, 5, 6 } };

            //jagged dizi oluşturuyorum. Her bir satır için new int[] deyimini tekrar kullanıyorum
            //Ayrıca her bir satır veri farklı uzunlukta oluşturuyorum
            int[][] jaggedDizi = { new int[] { 1, 2 }, 
                         new int[] { 3 }, 
                         new int[] { 4, 5, 6 } };

            DiziYaz(rectangularDizi); //Bu metot ile rectangularDizi verilerini ekrana yazacağım.
            Console.WriteLine(); //boş satır
            DiziYaz(jaggedDizi); //Bu metot ile jaggedDizi verilerini ekrana yazacağım.

            Console.ReadLine();
        }

        //Dizileri ekrana yazdıracağım metodu oluşturuyorum, önce rectangular
        public static void DiziYaz(int[,] dizi)
        {
            Console.WriteLine("Rectangular Dizi içindeki veriler:");

            //Rectangular dizi içindeki satırlar arasında dönecek döngümüzü oluşturuyorum
            for (int satir = 0; satir < dizi.GetLength(0); satir++)
            {
                //Rectangular dizi içindeki sütunlar arasında dönecek döngümüzü oluşturuyorum 
                for (int sutun = 0; sutun < dizi.GetLength(1); sutun++)
                {
                    Console.Write("{0} ", dizi[satir, sutun]);
                }
                Console.WriteLine(); //boş satır
            } // Döngü sonu
        } // metot sonu

        public static void DiziYaz(int[][] Dizi)
        {
            Console.WriteLine("Jagged Dizi içindeki veriler:");

            //JaggedDizi içindeki satırlar içinde dönecek döngümüz
            foreach (var satir in Dizi)
            {
                //JaggedDizi içinde yer alan her bir satır içindeki her bir eleman içinde döngüm
                foreach ( var eleman in satir )
                {
                    Console.Write("{0} ", eleman);
                }
                Console.WriteLine(); //boş satır
            } //foreach sonu
        } // metot sonu
    }
}

DiziYaz metodunun ilk kısmında rectangular tipindeki dizinin yazılması için kodlarımı oluşturdum. Görüleceği üzere burada iç içe bir for döngüsü var. Burada ayrıca GetLength metodunu kullandım. Bu metot ile herhangi bir dimension içindeki eleman sayısını elde ederiz. Buradaki for döngümde de iki boyutlu bir dizide yani iki dimensiona sahip bir dizi içinde elemanların sayısını alıyorum.

DiziYaz metodumun ikinci kısmında da jagged tipindeki dizinin yazılması için kodlarımı oluşturdum. Burada da iç içe foreach döngüsünden yararlandım. Yine iç içe foreach döngüm mevcut. İç kısımda yer alan foreach ile her bir satırda olan eleman sayısını sayıyorum. Dıştaki ile de her bir satırı sayıyorum.

Sonuç olarak ekran görüntüm aşağıdaki gibi:

2014040401

Aşağıdaki linkten uygulamayı indirebilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir