C# - Tömbkezelő osztály

forráskód letöltése
C#-ban találunk egy olyan osztályt mely sok funkcióval segít bennünket a tömbök és azokban lévő adatok kezelésében. Így például könnyedén rendezetté tehetünk egy tömböt a benne lévő elemek alapján, vagy kereshetünk benne.
Ez az osztály az Array nevet viseli. Nézzük miként használhatjuk fel például rendezésre. Ha adott egy tetszőleges tömbünk, tetszőleges elemekkel, akkor az Array osztály Sort függvényének átadva ezt, az elvégzi az elemek sorrendbe tételét.
      protected void button1_Click (object sender, System.EventArgs e)
      {
        Object[] o = {"B", "E", "C", "A", "D"};
        Array.Sort(o);
Rendezés után egy ListBox-ba meg is jelenítjük a tömb elemet, melyből jól látható, hogy mostantól már rendezettek a bennük lévő adatok.
        listBox1.Items.Clear();
        foreach (Object i in o)
        {
          listBox1.Items.Add(i.ToString());
        }
      }
Rendezni viszont nem csak így tudunk, hanem arra is van megoldás, hogy egy általunk megadott sorrend jöjjön létre. Ha például szeretnénk rendezni az Első, Második, Harmadik, stb. feliratokat, de nem ABC szerint, hanem a jelentésük alapján kapott szám szerint, akkor ezt megtehetjük úgy, hogy az első tömb mellé létrehozunk egy másikat is, melyben olyan kulcs értékeket adunk meg, amely alapján majdan a rendezés történik. Ez esetben a Sort függvény azon változatát használhatjuk rendezésre, mely két tömböt vár. Az elsőben a kulcsokat tartalmazó tömböt kell megadni, a másodikban pedig rendezendő elemeket tartalmazó tömböt.
      protected void button2_Click (object sender, System.EventArgs e)
      {
        Object[] keys = {2, 1, 4, 3, 5};
        Object[] items = {"Második", "Első", "Negyedik", "Harmadik", "Ötödik"};
        Array.Sort(keys, items);        
        listBox1.Items.Clear();
        foreach (Object i in items)
        {
          listBox1.Items.Add(i.ToString());
        }
      }
A Sort eddig tárgyalt mindkét esetében lehetőségünk van arra, hogy még két számot is átadjunk paraméterként. Ez esetben e két szám azt szabályozza, hogy az átadott tömb melyik elemétől kezdve történjen meg a rendezés, míg a második szám azt írja elő, hogy hány elem legyen ettől kezdve rendezve. Ezzel megoldhatjuk, hogy a tömbnek csak egy általunk megadott része váljon rendezetté.
        Array.Sort(o, 1, 4);
        Array.Sort(keys, items, 1, 4);        
A rendezés után most nézzük, miként kereshetünk meg egy elemet egy tömbben. Ehhez az IndexOf függvényt használjuk. Segítségével megtudhatjuk, hogy a keresett elem létezik-e a tömbben és ha igen, akkor hányadik eleme az a tömbnek.
      protected void button3_Click (object sender, System.EventArgs e)
      {
        Object[] items = {"B", "C", "A", "B", "E", "D"};
        int i;
        listBox1.Items.Clear();
Első paraméterként a tömböt, másodikként a keresett értéket kell átadnunk az IndexOf számára. Ha a keresett elem nincs a tömbben, akkor –1 lesz a visszatérési érték, ha van, akkor pedig az adott elem tömbbeli indexét kapjuk vissza.
        i = Array.IndexOf(items, "B");
        listBox1.Items.Add("First B: " + i.ToString());
Az IndexOf mindig az első előfordulást adja vissza a tömbben. Ha viszont többször is szerepel ugyanaz az elem, akkor a LastIndexOf segítségével megkaphatjuk az utolsó előfordulás index számát is.
        i = Array.LastIndexOf(items, "B");
        listBox1.Items.Add("Last B: " + i.ToString());
        i = Array.IndexOf(items, "F");
        listBox1.Items.Add("F: " + i.ToString()); 
      }
Ha az IndexOf, illetve a LastIndexOf függvénynél harmadik paraméterként megadunk egy számot, akkor ezzel arra utasítjuk a függvényeket, hogy ettől az indextől kezdjék a keresést. Ez akkor jön jól, ha egy tömbön végig akarunk menni és egy adott érték összes előfordulási helyét szeretnénk megtalálni. Amikor találat van, akkor ezt feldolgozzuk, majd a függvény újbóli meghívásával tovább folytathatjuk a keresését.
Ha e két függvénynek negyedik paramétert is adunk, mely szintén egy szám lehet, akkor ezzel szabályozhatjuk, hogy a keresés a tömbben hányadik elemig folytatódhat.
Az Array osztály használatánál lehetőség van arra is, hogy ne csak egy már létező tömböt dolgozzunk fel, hanem pont ezzel az osztállyal hozzunk létre egy tömböt és kezeljük. Ekkor a CreateInstance függvénnyel létrehozhatunk egy példányt az Array osztályból. Paraméterként meg kell adnunk, hogy az elemek milyen típusúak legyenek, illetve, hogy hány darab legyen a tömbben.
      protected void button4_Click (object sender, System.EventArgs e)
      {
        Random r = new Random();
        Array a = Array.CreateInstance(typeof(Int32), 5);
Ekkor a SetValue függvényt használva értéket is adhatunk a tömbünk elemeinek. Itt első paraméterként az elem értékét kell megadnunk, másodikként pedig az elem sorszámát, melynek az értékadást végezzük.
        for (int i = 0; i < 5; i++)
        {
          a.SetValue(r.Next(), i);
        }
        listBox1.Items.Clear();
        foreach (Int32 i in a)
        {
          listBox1.Items.Add(i.ToString());
        } 
      }
A GetValue függvénnyel le is kérdezhetjük az egyes elemek értékét. Paraméterként a lekérdezendő elem sorszámát kell megadnunk. Több dimenziós tömb esetén maximum három számot adhatunk meg, vagyis három dimenziót tudunk kezelni így. Ha ennél több dimenziós lenne a tömbünk, akkor itt paraméterként is egy tömböt kell átadnunk, mely int típusú számokat tárol, amelyben az indexek helyezkednek el. Ekkor már tetszőleges dimenzió számú lehet a kezelt tömb.
A Length property-t használva kiolvashatjuk, hogy hány eleme van a létrehozott tömbünknek.
Ha egy tömb elemeit törölni szeretnénk, vagyis nullát, illetve null értéket elhelyezni bennük, akkor ezt megtehetjük a Clear statikus függvény hívásával. Itt első paraméterként a kezelni kívánt tömböt kell megadni, másodikként azt az index számot, ahonnan a törlést kezdjük a tömbben, harmadikként pedig azt a számot, hogy ettől kezdve hány elemet szeretnénk törölni.
A Reverse függvény hívásával megfordíthatjuk a tömb elemeinek sorrendjét. Lehetőség van arra, hogy az összes elemet megfordítsuk, ekkor paraméterként csak a tömböt kell átadni, de az is megoldható, hogy a tömb elemeinek csak egy részét fordítsuk meg. Utóbbi esetben a tömbön kívül még meg kell adnunk paraméterként a kezdő index sorszámát és azt is, hogy hány elem kerüljön megfordításra.