26 Haziran 2013 Çarşamba

Linux İşletim Sistemi/Linux Komutları/Disk komutları

< Linux İşletim Sistemi / Linux Komutları

Konu başlıkları

  [] 
  • 1 df

  • 2 du
  • 3 mount
  • 4 umount

  • df[]

    Salt olarak kullanıldığında sabit disk(ler)in ve bölüm(ler)in (partition) toplam boyutlarını, kullanılmış alanlarını, boş alanlarını, yüzde kaçının dolu olduğunu ve nereye bağlı olduğunu verir. Çıktısı şuna benzer bir şeydir:
    Dosyasistemi         1K-blok        Dolu Boş       Kull%Bağlanılan yer
    /dev/sda5             60743612  16382312  43744180  28% /
    tmpfs                   509664       608    509056   1% /dev/shm
    /dev/sda1             55505488  11465220  44040268  21% /mnt/sda1
    
    "1K-blok" yazan yer ilgili bölümün (veya sabit diskin) toplam boyutudur. Varsayılan durumda bu değerler KB cinsinden görüntülenir. Ancak istersek ekleyeceğimiz çeşitli seçeneklerle bu birimi değiştirebiliriz. m seçeneği ile sonuçların MB cinsinden olmasını k seçeneği ile de KB cinsinden olmasını sağlarız (varsayılan). Ancak bunlardan en kullanışlısı h'dir. h seçeneği ile sonuçların gösterilebilecek en büyük birimle gösterilmesini sağlarız. Örnek:
    df -h
    

    du[]

    Salt olarak kullanıldığında aktif klasörün ve aktif klasörün altındaki tüm klasörlerin (alt klasörler de dahil) isimlerini ve toplam boyutlarını verir. Burada boyuttan kastımız ilgili klasörün içindeki her şeyin boyutudur. Bu durumu kolay anlayabilmeniz için olayı şöyle somutlaştırayım: aktif klasörünüzün alt klasörleri şöyle olsun:
    Ana Klasör
    • dosya1.mpg
    Alt Klasör
    • dosya1.mpg
    • dosya2.mpg
    Alt-Alt klasör
    • dosya1.mpg
    Buradaki dosya1.mpg dosyasının birden fazla klasörde birer kopyası var. Alt Klasör klasöründe de bir dosya2.mpg dosyası var. dosya1.mpg dosyasının boyutu 10 MB, dosya2.mpg dosyasının ise 20 MB olsun. Biz Ana Klasör klasöründeyken du komutunu verirsek şöyle bir çıktı alırız (du komutunu h seçeneği ile verin ki boyut bilgilerini okumak kolay olsun):
    10M     ./Alt Klasör/Alt-Alt klasör
    40M     ./Alt Klasör
    50M     .
    
    Tahmin edebileceğiniz gibi du komutunun m, k (varsayılan) ve h seçenekleri vardır. Ayrıca istersek du komutuyla belirli bir klaasörün boyutunu da öğrenebiliriz. Ancak bunun için komuta s seçeneğini eklemeliyiz. Örnek:
    du -sh ../Klasör
    
    Bu komutla bir üst klasördeki Klasör klasörünün ismini ve boyut bilgisini en okunaklı şekilde alırız. Ancak bu durumda sadece belirttiğimiz klasörün bilgisi verilir. Alt klasörlerin bilgisi verilmez. Örneğin şu komutu verirsek:
    du -sh "Ana Klasör"
    
    şöyle bir çıktı alırız: (yukarıdaki klasör ağacımızdaki Ana Klasör klasörü)
    50M     Ana Klasör
    
    Bu yöntemle sadece klasör değil, dosya da belirtebiliriz. Örnek:
    du -sh *.mpg
    
    Bu komutla aktif klasördeki mpg uzantılı dosyaların boyutlarını bir liste şeklinde alırız.
    du -sh *.mpg *.flv
    
    Bu komutla aktif klasördeki mpg ve flv uzantılı dosyaların boyutlarını bir liste şeklinde alırız.
    du -sh *.mpg *.flv Klasor
    
    Bu komutla da aktif klasördeki mpg ve flv uzantılı dosyaların ve Klasor klasörünün boyutlarını bir liste halinde alırız.

    mount[]

    mount komutu ile herhangi bir aygıtı herhangi bir klasöre bağlayabiliriz. Bu sayede o klasörü açtığımızda o aygıtın içindekilere erişebiliriz. Aslına bakarsanız Ubuntu ve Pardus gibi modern dağıtımlarda bu işlem otomatik olarak gerçekleşir. Örneğin CD-ROM sürücüsüne bir CD taktığınızda CD'yle ne yapmak istediğinizi belirten bir ileti kutusu görüntülenir. Ancak modern dağıtımlarda mount komutunun kullanılması kısıtlanmamıştır. Şimdi CD-ROM sürücünüze bir CD yerleştirin ve şu komutu verin:
    mount /dev/cdrom "Yeni Klasör"
    
    Bu komutu verdikten sonra aktif dizininizdeki Yeni Klasör klasörünü açtığınızda taktığınız CD'deki dosya ve klasörleri görebileceksiniz.

    umount[]

    umount komutu mount komutunun yaptığının tersini yani "bağlantıyı kesme" işlemini yapar. Bu sayede CD-ROM'a bağlı klasörünüzün gerçek içeriğini tekrar görebilirsiniz. Az önceki bağlantıyı kesmek için şu komutu verin:
    umount /dev/cdrom
    
    NOT: mount ve umount komutlarını kullanabilmeniz için root modunda olmalısınız.
    NOT: Dosya yöneticinizde mount komutunu vermenize rağmen Yeni Klasör klasöründe CD'nin içeriği gözükmüyorsa, veya umount komutunu vermenize rağmen halen gözüküyorsa birkaç kez F5'e basmanız, dosya yöneticinizi kapatıp açmanız ve/veya biraz beklemeniz gerekebilir.
    NOT: Bağlantının yapılabilmesi veya sorunsuz kesilebilmesi için komut isteminde bağlanan klasörün içinde olmamanız tavsiye edilir.

    25 Haziran 2013 Salı

    PL / SQL Nedir? PL / SQL ile Programlama’ ya Giriş

    Sql ilişkisel veritabanlarında veriye ulaşmak ve bu veriyi okumak, yorumlamak, değiştirmek yada verinin depolandağı birimler ile her türlü işlemlerin yapıldığı kodlardır.

    SQL (Structured Query Language) yani yapısal sorgulama dili aslında dört kategoride düşünülebilir.

    DDL : (Data Definition Language): Verinin tutulacağı tablo  yada veritabanı ile ilgili tanımlama yada oluşturma işlemlerini yaptığımız komutlardır.Bunlardan en genel kullanılanlar aşağıdaki komutlarıdır.
             CREATE         – Veritabanında nesne yaratır.
             ALTER           – Veritabanının yapısını değiştirir.
             DROP            – Veritabanından obje siler.
             TRUNCATE     – Tablodaki kayıtları içerdikleri alan ile birlikte siler.
             COMMENT      – Yorum ekler.
             RENAME        – Nesnenin asını değiştirir.


    DML: (Data Manipulation Language):Verileri tabloya ekleme, tablodan çıkarma gibi yada veriler üzerinde yapılan değişiklikler için kullanılan komutlarıdır.
            SELECT       – Veritabanından kayıt okur.
            INSERT        – Tabloya kayıt ekler.                 UPDATE       – Tablodaki kayıdı günceller.                 DELETE        – Tablodan kayırları siler ancak kapladığı alan kalır.                 MERGE         – UPSERT işlemi (ekleme veya güncelleme)                 CALL            – PL/SQL veya Java alt programı çalıştırır.

             TCL:(Transaction Control Language):Transaction veritabanındaki işlem yada işlemlerdir. Bu işlemlerin tablo yada şema gibi depo birimleri yada datalar üzerinde yapacaklar değişikliklerin geçerli olmasını yada geri almayı sağlarız.Böylece transctionları kontrol etmiş oluruz.
    COMMIT        – Yapılanları kayıt eder.
    SAVEPOINT    – Daha sonra geri dönülecek bir dönüş noktası belirler.
    ROLLBACK     – Son COMMIT’e kadar olan yeri geri alır.

             DCL:(Data Control Language):Veritabanı üzerinde Datalara erişimi kontrol etmek amacıyla kullandığımız komutlardır.
    GRANT – Kullanıcıya veritabanı erişim yetkisi verir.
    REVOKE – GRANT ile verilen yetkiyi geri alır.

    İşte bu komutları db de belli bir sıra ile veya kontrol mekanizması ile veya devasa işlemlerin smart bir model ile db den gerçekleştirildiği durumlarda PL / SQL kullanmak gerekmektedir. Bunun anlaşılması için şöyle bir örnek verilebilir. Mesela 10.000 çalışanı olan bir firma askeri ücret ile çalışan vatandaşlarının maşını 2 katına çıkarmak istiyor ve sizen bu işlemi sisteme yansıtmanızı ve raporlamanızı istiyor.

    İki şekilde yapmanız mümkün: 

    1- Çalışanların kayıtlarının olduğu tabloda, maaşı 629,95 Tl  olanları bulup, sonra bunları güncellemeli ve daha sonrada raporlamalısınız. Hadi bu işlem bir kere yapılacak, peki ya her gün , fer saat vs. Yapılacak işlemleri manuel komut çalıştırarak yapmak tüm vaktinizi alacaktır.

    2- Bir PL/SQL program birimi yazıp aynı işlemleri her seferinde yapmadan hatta memory biriminide kullanarak (değişkenlerde veri saklama) tek bir F9 ile yapabilir yada planlı iş olarakta atayabilirsiniz.

    PL/SQL faydaları nelerdir?
    1-PL/SQL prosedürel bir yapıya sahiptir.(if/else, for , while gibi kontrol mekanizmalarına izin verir). Sql prosedürel bir yapıda değildir.
    2-Tek seferde istediğiniz kadar işlemi db ye göndereceğinizden her seferinde sql queryler çalıştırmaktan daha hızlı toplam sonucu alabilirsiniz.
    3- Çalıştırmış olduğunuz sql kodlarını, debug etme, loglama yada module etme gibi işlemleri PL/SQL blocklarla yada yapılarla sağlayabilirsiniz.
    4-Oracle Forms, Oracle Report gibi toollara entegre olabilir.
    5-Exception handling ile hata yakalama ve bu durumlarda farklı işlemler tanımlayabilir yada loglama yapabilirisiniz.

    En Basit PL/SQL block yapısı şekil1 de gözüktüğü gibidir.

                                   Şekil1: PL/SQL block yapısı

    Şekil1 de alanları açıklayacak olursak BeginàEnd; Kısmı bir pl/sql block için olması şart olan kısımdır. Diğer alanlar eğer gerekli ise eklenir,

    Declare tanımlama alanıdır.Burada memory içinde saklayabileceğiniz değişkenleri yada cursor gibi tanımlamaları yapabilirsiniz,

    Begin à End; Bu alanda asıl çalışacak sql kodlar, if/else gibi kontrol yapıları yada tüm işlemlerimiz yazılır.

    Exception  alanında oracle tarafından tanımlanmış hata bildirimlerini yada kandininiznde tanımlayabileceği hatalar yada sizin kontrolunuzde olamyan durumlar karşısında neler yapmak isteyeceğinizi bildirebilirsiniz.


    Şekil2 : PL/SQL blok Tipleri
             Şekil 2 de pl/sql blok tipleri gösterilmiştir.

    Anonim blocklar bir isme sahip değildir ve çalıştırılması için tüm block çağrılmalıdır. Veritabanında saklanmazlar.1 defaya mahsus kullanımda genelde tercih edilirler.

    Prosedürlerin bir ismi vardır ve veritabanında, tablo yada index gibi bir şema altında depolanıp saklanabilirler. Diğer programlar yada scriptler içinde kullanılabilirler.Ayrıca isimleri ilede çağrılıp işlevini yerine getirebilirler.Birden çok değer getirebilirler.

    Fonksiyonlar da prosedürler gibi , veritabanında saklanıp, çeşitli yerlerde çağrılabilirler.Ancak fonksiyonlar tek bir değer döndürürler ve bir veriye return edilmeleri gerekir.

    Örnek bir anonim block aşağıdaki gibi olabilir.
    declare
    tarih date;
    begin
    select sysdate into tarih from dual;
    dbms_output.put_line(tarih);
    end;

    Burada bir anonym pl/sql blok yazdık ve bu blok tarihi output olarak bize yazdırmaktadır. Tarih kelimesi görüldüğü üzere bir değişkendir. Ve biz bu değişkenin içine dual tablosundan sistem zamanını atadık.Bu blokların içindede bloklar olabilir, nested bloklar denmektedir.
    Begin
          Begin
                ...
          End;
    End;

             Pl/sql bloklar için select cümleleri yazılıp çekilen dataların yorumlanabileceği gibi, insert , update, delete , merge cümleleride yazılabilir.

             Pl / Sql Cursor (imleç) ler;
    Pl /sql ile veritabanına yönelik yazılımlar yaparken en çok kullanılan yazpılardan biridir. Cursor birden çok veriyi memory de tutup yorumlayabilmemizi sağlar. Nasıl ki değişkenler tek bir adet veriyi tutuyorsa , cursor ‘lerde bir çok veriyi hatta tabloları tutabilen pl/sql yapılarıdır.

    Cursor’ler oracle tarafından oluşturulan (implicit) ve Kullanıcılar tarafından oluşturalan (explicit) olmak üzere iki çeşittir. Aşağıda implicit cursor için bazı tanımlamalar mevcuttur.

    Sql%notfound à belli bir kritere göre data yok sa true döner.
    Sql%found     à Belli bir kritere göre data varsa true döner.
    Sql%rowcount à Etkilenen Toplam row sayısını verir.

    Declare
    Rows_deleted varchar2(30);
    Begin
    Delete from my_table
    Where some_column=124;
    : Rows_deleted := (sql%rowcount || ‘row deleted’);
    End;

    Yukarıdaki örnekte sql%rowcount kullanımına yönelik bir çalışma yaptık, görüldüğü üzere kaç kayıt silinmiş bize bilgisini vermektedir.Aşağıda ise iki adet pl/sql blok bulunmaktadır.Her ikiside aynı amaca yönelik yazılmıştır.

    Bu bloklar hr.employees tablosunda ismi D ile başlayan kayıtları bize sunmaktadır.Ancak 1. Blok bir implicit cursor ile ikinic bloktada explicit cursor ile yazılmıştır.

    1-implicit cursor örnek;

    declare
    cursor c is select * from hr.employees where first_name like 'D%';
    rec hr.employees%rowtype;
    begin
    open c;
    loop
    fetch c into rec;
    dbms_output.put_line(rec.first_name);
    exit when c%notfound;
    end loop;
    close c;
    end;

    2-Explicit cursor örnek;
    begin
    for i in (select * from hr.employees where first_name like 'D%')
    loop
    dbms_output.put_line(i.first_name);
    end loop;
    end;

          
    Örnek 2 de for döngüsünün nasıl kullanıldığınıda görmüş olduk.Bununla birlikte aşağıdaki gibi bir örnnekte karar yapılarını gösterebilir.
               
    declare
    myage number :=28;
    begin
    if myage < 11
     then
        dbms_output.put_line(' I am a child '); 
     else
        dbms_output.put_line(' I am not a child ');
    end if;
    end;

    24 Haziran 2013 Pazartesi

    C# - Array (Diziler)

    C# da Diziler
    Diziler için aynı tipteki verilerin tutulduğu bir koleksiyon diyebiliriz. Örneğin integer verinin bir yığın şeklinde tutulması için dizileri kullanırız. C# da diziler referans tipinde değişkenlerdendir. C# da tanımlanan tüm diziler System.Array sınıfından türemiş bir nesnedir. C# da diziler aşağıdaki gibi tanımlanır.
    [] = new [];

    10 adet integer veri tutan bir dizinin tanım ise
    int[] integerDizi = new int[10];

    Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.
    int boyut = 10;
    int[] integerDizi = new int[boyut];

    Diziyi tanımlama ve başlangıç değerlerini atama işlemini ayrı satırlardada yapabilirsiniz
    .
    int[] integerDizi;
    integerDizi = new int[10];

    Ayrıca dizileri tanımlarken, dizi içine atmak istediğiniz verileride belirterek dizi tanımlayabilirsiniz. Bunun için kullanacağınız veri tipine uygun olacak şekilde, süslü parantez içinde her biri virgülle ayrılmış dizi elemanlarını yazmanız yeterli
    .
    int[] integerDizi = {1,2,3,4,5,6,7,8,9};

    Yukarıda 10 adet elemanı olan ve değerleri de verilmiş, integer tipinde verileri tutan bir dizi tanımladık. Eğer dizimiz string değerler tutacak olsaydı, süslü parantez içine yazdığımız elemanların her birini çift tırnaklar arasına almamız gerekirdi.
    string[] strDizi = { "Sabri", "Metin", "Osman", "Ali" };

    Dizi Elemanlara Ulaşmak
    Dizi elemanlarına ulaşmak için [indeks] indeks operatörünü kullanırız. Dikkat edilmesi gereken nokta C# da dizilerin elemanları 0. İndeksten başlar, yani eğer 5 elemanlı bir dizimiz varsa bu dizinin birinci elemanı 0. indekste son elemanı ise 4. indekstedir. 5 elemanlı bir dizinin 3. elemanına aşağıdaki gibi erişiriz.
    int[] integerDizi = { 1, 2, 3, 4, 5};
    int ucuncuEleman = integerDizi[2];

    Bir dizi içindeki elemanlara ulaşmak için basit bir örnek:
    int[] integerDizi = { 4, 8, 23, 64, 35 };
    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine("Dizinin {0}. Elemanının Değeri = {1} ", i, integerDizi[i]);
    }

    Yukarıdaki kodun çalışması sonucu oluşan ekran görüntüsü:
    Dizinin 0. Elemanının Değeri = 4
    Dizinin 1. Elemanının Değeri = 8
    Dizinin 2. Elemanının Değeri = 23
    Dizinin 3. Elemanının Değeri = 64
    Dizinin 4. Elemanının Değeri = 35

    Yukarıdaki örnekte bir dizi oluşturduk ve bu dizinin eleman sayısı kadar bir for döngüsü kurduk. Döngü içinde diziye ait elemanların değerlerine tek tek ulaştık.
    Peki kullandığımız dizinin eleman sayısını bilmeseydik nasıl döngüye girebilirdik. Bütün diziler System.Array sınıfından türemiş nesnelerdir demiştik. System.Array sınıfının Length diye bir özelliği vardır, doğal olarakda tüm dizilerinde bir Length özelliği olur. Dizimizin eleman sayısını dizininAdi.Length diyerek alabiliriz. Yukarıdaki örneği bu yöntemle yeniden yazacak olursak.
    int[] integerDizi = { 4, 8, 23, 64, 35 };
    for (int i = 0; i < integerDizi.Length; i++)
    {
        Console.WriteLine("Dizinin {0}. Elemanının Değeri = {1} ", i, integerDizi[i]);
    }

    Yukarıdaki kodu çalıştırdığınızda bir önceki örneğimizle aynı sonucu üretir.
    Dizilerle ilgili dersimize devam etmeden önce diziler için kullandığımız foreach döngüsüne bakalım.
    foreach Döngüsü
    Diziler ve koleksiyonların elemanlarına erişmek için basit ve kullanışlı bir döngü çeşidi. Döngüler dersinde bahsetmedik çünkü dizileri anlatmadan foreach döngüsünü anlamaya çalışmak boşuna olacaktı. foreach döngüsünün yapısı aşağıdaki gibidir.
    foreach( in )
    {
       
    }

    Yukarıda for döngüsü ile yaptığımız örneğimiz foreach döngüsü ile yapalım.
    foreach (int diziElemanı in integerDizi)
    {
        Console.WriteLine("Elemanın Değeri = {0} ", diziElemanı);
    }

    Çok daha basit ve kullanışlı olduğunu görebilirsiniz.
    ·         Foreach döngüsü kullanırken ulaştığımız dizi elemanları readonly dir. Yani yukarıdaki örnek üzerinde anlatacak olursak foreach döngüsü içinde diziElemanı adlı integer değişkenin içerdiği değeri değiştiremezsiniz. Eğer değiştirmeye kalkarsanız Cannot assign to 'diziElemanı' because it is a 'foreach iteration variable' hatası alırsınız. Eğer yazdığınız uygulamada dizi elemanlarını döngü içinde değiştirmek istiyorsanız for döngüsü kullanmanızı tavsiye ederim.
    ·         String tipindeki bir değişkende char tipindeki verilerin birleşmesinden oluşmuş bir dizidir. Öyleyse foreach döngüsü kullanarak aşağıdaki gibi bir stringin elemanlarını erişebilirsiniz.
    string metin = "aa";
    foreach (char harf in metin)
    {
        Console.WriteLine("Harf = {0} ", harf);
    }

    Çok Boyutlu Diziler (Multidimensional Array)
    Çok boyutlu bir dizi ‘dizinin dizisi’ şeklinde tabir edilebilir. Her elemanı başka bir dizi olan diziler çok boyutlu bir dizidir. Çok boyutlu bir dizi veritabanında her satırında birden fazla kolon bulunan bir tabloya benzetilebilir. Eğer her satırda bulunan her kolon kendi içinde başka bir dizi barındırmıyorsa bu tür dizilere 2 boyutlu diğer bir değişle çok boyutlu diziler denir. Eğer her kolonda kendi içinde başka bir dizi barındırıyorsa bu tür dizilere n boyutlu diziler denir. Burda n ifadesi dizinin derinliğini ifade eder.
    Çok boyutlu diziler iki çeşittir;
    ·         Düzenli Diziler: Her satırı aynı sayıda kolon barındıran diziler.
    ·         Düzensiz Diziler (Jagged Array) : Her satırı farklı sayıda kolon barındıran diziler.
    Çok boyutlu dizileri şekillerle anlatmaya çalışalım.
    Not: Dizilerin ilk elemanının indeks numarasının 0 olduğunu unutmayın.

    Dizilerin Tanımlanması ve Değer Atamaları
    Tek boyutlu bir dizinin nasıl tanımlandığını ve nasıl değer atayacağımızı yukarda anlatmıştık. Şimdi Tek boyutlu dizi dahil tüm dizi tiplerini nasıl tanımlayacağımıza bakalım.
    Tek Boyutlu Diziler:
    //Dizinin Oluşturulması
    int[] intDizi = new int[5];

    //Dizi elemanlarına değer ataması
    intDizi[0] = 36; //dizinin ilk elemanına 36 değeri atandı
    intDizi[2] = 26; //dizinin ikinci elemanına 26 değeri atandı
    intDizi[4] = 32; //dizinin son elemanına 32 değeri atandı

    Çok Boyutlu Diziler:
    //Dizinin Oluşturulması
    int[,] intCokBDizi = new int[2, 3];

    //Dizi elemanlarına değer ataması
    intCokBDizi[0, 0] = 23;
    intCokBDizi[0, 1] = 25;
    intCokBDizi[0, 2] = 33;
    intCokBDizi[1, 0] = 41;
    intCokBDizi[1, 1] = 29;
    intCokBDizi[1, 2] = 93;

    Çok Boyutlu Dizilerin Elemanlarına Döngü İle Ulaşmak
    for döngüsü:
    //Dizi elemanlarını for döngüsü ile bulmak.
    for (int row = 0; row <; intCokBDizi.GetLength(0); row++)
    {
        for (int col = 0; col < ; intCokBDizi.GetLength(1); col++)
        {
            Console.WriteLine("Dizinin {0},{1} indeksindeki değeri : {2}",row,col,intCokBDizi[row,col]);
        }
    }

    Ekran Çıktısı:
    Dizinin 0,0 indeksindeki değeri : 23
    Dizinin 0,1 indeksindeki değeri : 25
    Dizinin 0,2 indeksindeki değeri : 33
    Dizinin 1,0 indeksindeki değeri : 41
    Dizinin 1,1 indeksindeki değeri : 29
    Dizinin 1,2 indeksindeki değeri : 93

    GetLength() fonksiyonu dizinin belirtilen boyutundaki eleman sayısını verir. Yukarıdaki örnekte görüldüğü gibi parametre olarak 0 veya 1 veriyoruz. 0 dizinin birinci boyutundaki eleman sayısı yani satır sayısı, 1 verdiğimizde ise dizinin 2.boyutu yani kolon sayısını verir
    .
    Dizilerin Length özelliği dizi içinde bulunan toplam eleman sayısını verir. Örneğin yukarıdaki örnekte tanımladığımız dizi için intCokBDizi.Length sonuç olarak 6 döndürür.
    2 boyutlu Düzensiz dizilerde foreach döngüsü kullanamayız. foreach döngüsünü sadece tüm elemanlara erişmek için kullanabiliriz. Eğer her boyuttaki elemana farklı erişmek istiyorsak for döngüsü kullanmamız gerekiyor. foreach döngüsü ile düzensiz 2 boyutlu dizilerin elemanlarına erişebiliriz. Önce düzensiz dizilerin nasıl tanımlandığına bakalım sonrada foreach döngüsü ile elemanlarına nasıl erişeceğimize göz atalım.
    Düzensiz Çok Boyutlu Diziler:
    //Dizinin Oluşturulması
    int[][] intCokBDizi = new int[3][];

    //İkinci boyutta bulunan her elemanda bir dizi olduğuna göre
    //onlarıda new komutu ile ayarlamamız gerekir.
    intCokBDizi[0] = new int[2];
    intCokBDizi[1] = new int[4];
    intCokBDizi[2] = new int[3];

    //Dizi elemanlarına değer ataması
    intCokBDizi[0][0] = 13;
    intCokBDizi[0][1] = 15;

    intCokBDizi[1][0] = 21;
    intCokBDizi[1][1] = 29;
    intCokBDizi[1][2] = 29;
    intCokBDizi[1][3] = 23;

    intCokBDizi[2][0] = 39;
    intCokBDizi[2][1] = 39;
    intCokBDizi[2][2] = 33;

    Bir önceki anlattığımız düzensiz çok boyutlu dizide for döngüsü kullanarak elemanlara tek tek ulaşmıştık. Düzensiz dizilerde elemanlara tek tek ulaşmak istediğimizde for döngüsü yerine foreach döngüsü kullanıyoruz.
    foreach Döngüsü:
    foreach (int[] row in intCokBDizi)
    {
        foreach (int col in row)
        {
            Console.WriteLine(col);
        }
        Console.WriteLine("---------");
    }

    Ekran Çıktısı
    13
    15
    ---------
    21
    29
    29
    23
    ---------
    39
    39
    33
    ---------
    ---------
    21
    29
    29
    23
    ---------
    39
    39
    33
    ---------

    Yukarıda anlattıklarımızın ışığında 3 boyutlu düzenli ve düzensiz dizileri nasıl tanımlarız ve bunlara nasıl değer ataması yaparız bir örnekle anlatalım.
    //3 boyutlu düzenli dizi tanımlama
    int[,,] intUcBDizi = new int[2,3,2];

    //3 boyutlu düzenli diziye değer atama
    intUcBDizi[0, 0, 0] = 1;
    intUcBDizi[0, 0, 1] = 34;
    intUcBDizi[1, 1, 0] = 156;

    //3 boyutlu düzensiz dizi tanımlama
    int[][][] intUcBDuzensizDizi = new int[2][][];

    //3 boyutlu düzensiz dizinin alt elemanlarını ayarlama
    intUcBDuzensizDizi[0] = new int[2][];
    intUcBDuzensizDizi[0][0] = new int[3];
    intUcBDuzensizDizi[0][1] = new int[4];

    intUcBDuzensizDizi[1] = new int[3][];
    intUcBDuzensizDizi[1][0] = new int[2];
    intUcBDuzensizDizi[1][1] = new int[5];
    intUcBDuzensizDizi[1][2] = new int[3];

    //3 boyutlu düzensiz diziye değer atama
    intUcBDuzensizDizi[0][0][0] = 129;
    intUcBDuzensizDizi[0][0][1] = 65;
    intUcBDuzensizDizi[0][1][0] = 119;
    intUcBDuzensizDizi[0][1][1] = 35;
    intUcBDuzensizDizi[1][1][1] = 30;
    intUcBDuzensizDizi[1][2][1] = 37;

    Örneklerimizde hep integer tipinde veri tutan dizilerden bahsettik. Örneklerle string değer tutan dizilerin nasıl kullanıldığını basitçe anlatalım.
    string[] isim = new string[4];

    Dizi elemanlarının değerlerini oluşturma anında vermek
    string[] isim = new string[4]{"Sabri","Seher","Ali","Metin"};

    //veya

    string[] isim2 = new string[] { "Sabri", "Seher", "Ali", "Metin" };

    //veya

    string[] isim3 = { "Sabri", "Seher", "Ali", "Metin" };

    //veya tanımlama ve değer oluşturma işlemini ayrı satırlarda yapma

    string[] isim4;
    isim4 = new string[4] { "Sabri", "Seher", "Ali", "Metin" };

    İlk oluşturma anında elemanlara değer verme işlemini 2 boyutlu dizilerde de aşağıdaki gibi yapabiliriz.
    string[][] isimListesi = { new string[] { "Sabri", "Seher" }, new string[] { "Ahmet", "Mehmet", "Zuhal", } };