Ide tartoznak a stringek, a felsorolt típus, a rekordok, a lista, a szótár, és a halmaz.
Felsorolt típus
A felsorolt típus névvel ellátott értékekből áll. Felsorolt típus csak a következő típusokat veheti fel: byte, sbyte, short, ushort, int, uint, long, ulong. Ha egy felsorolt típus esetén nem rendelkezünk, hogy az milyen típuson tárolja az értékeket, akkor az alapértelmezés szerint int típus lesz. Egy felsorolt típust az enum kulcsszó után adhatunk meg. Először a nevét kell megadnunk, majd { } jelek között fel kell sorolnunk, hogy milyen elemei lesznek az új típusnak. Ha nem használunk értékadást az elemek megnevezése után, akkor azok értéke nullától kezdve egyesével fog nőni. Amennyiben valamely elem kap értéket, de az utána következő nem, akkor e második elem értéke az előzőhöz képest eggyel nagyobb lesz.
példa1: Hozzunk létre egy új felsorolt típust!
enum Game
{
Quake = -1,
Unreal,
GTA= 100,
FreeSpace
}
példa2: Hozzunk létre egy új felsorolt típust, amelyben sportágakat tárolunk! A neve: sportok. Az elemeire hivatkozhatunk a nevükkel. Írassuk ki az úszás, biciklizés sorszámát!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
namespace felsorolttipus { class Program { enum sportok { uszas, biciklizes, futas, vizilabda, forma1} static void Main(string[] args) { sportok a = sportok.uszas; Console.WriteLine("A sportág neve: {0}, sorszáma:{1} ", a, (int)a); sportok b = sportok.biciklizes; Console.WriteLine("A sportág neve: {0}, sorszáma:{1} ", b, (int)b); Console.ReadKey(); } } } |
Enum típust csak metóduson kívül de osztályon belül lehet létrehozni!
Struktúra, rekord
A rekord egy adattáblára hasonlít, oszlopokból és sorokból áll. Különböző típusú adatok tárolására képes. A rekordok olyan adatszerkezetek, melyek:
- összetett, vagyis egy rekord típusú változóban egy időben több adat is tárolható,
- inhomogének, vagyis a bennük tárolt adatok típusai különbözőek is lehetnek,
- random elérésű, vagyis a rekord elemeihez azonos sebességgel lehet hozzáférni,
- fix méretűek, vagyis deklaráláskor meg kell adni milyen adatokat (és hány darabot) akarunk tárolni,
- folytonos tárolású, a rekordban tárolt értékek a memóriában egymás után helyezkednek el.
Első lépésben a rekordot, mint típust kell létrehoznunk, leírva azt, hogy milyen mezőkből épül fel, felsorolván a mezők típusait és neveit. Ennek az egész rekord típusnak adni kell egy azonosító nevet (a típus nevét). Később ezen típusnév felhasználásával tudunk rekord típusú változókat létrehozni, vagy akár ilyen típusú tömböket, listákat is. Egyetlen ilyen rekord típusú változó egyszerre több adatot is képes tárolni a mezőiben. Egyszerre egy mezővel szoktunk dolgozni.
A rekord típus létrehozásának egyik módja a struct kulcsszó használatával történik:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
struct DVD { public string Cime; public int Ara; public int MegjelenesEve; } //egy elem létrehozása dvd pelda; pelda.Cime = "Terminator I"; pelda.Ara = 2500; pelda.MegjelenesEve = 1982; //példa dvd adatainak kiíratása Console.WriteLine("Cím: {0}, Ár: {1},Dátum: {2}",pelda.Cime,pelda.Ara,pelda.MegjelenesEve); //10 elemű tömb hozzáadása. példa dvd tárolása a tömbben dvd[] kollekcio = new dvd[10]; kollekcio[0] = pelda; Console.WriteLine("A 0. tömbelem tartalma: {0}{1}{2}",kollekcio[0].Cime,kollekcio[0].Ara, kollekcio[0]..MegjeleneEve); |
Ezzel hozunk létre egy új típust, melynek választott neve a ’DVD’ lesz. Három mezője van, a ’Cime’, ’Ara’, ’MegjelenesEve’. A public kulcsszó használata gyakorlatilag kötelező, mivel nélküle nem lehetne később a mező nevére hivatkozni. A public kulcsszó a védelmi szintek kapcsán kerül ismertetésre, és gyakorlatilag azt jelenti, hogy a mező neve, mint azonosító hatásköre terjedjen ki a programszöveg minden pontjára. Hiányában a befoglaló blokkjelig tartana, vagyis a mező nevére nem lehetne hivatkozni a DVD rekord típuson kívül.
Szótár
A szótár elempárok tárolására szolgál, melyek közül egyik a kulcs, amely azonosítja az elempárt, másik az érték, minden kulcs egyedi. Gyakorlatilag a szótár úgy viselkedik, mint egy lista, de az elemek indexe itt tetszőleges típusú lehet (pl.: szöveg).
Konstruktora generikus, paraméter nélküli:
◦ Dictionary<TKey, TValue>(): létrehoz egy szótárt, ahol TKey a kulcs, TValue az érték
típusa
Fő metódsai:
- void Add( TKey key, TValue value ): a value érték hozzáadása key kulccsal
- bool ContainsKey( TKey key ): megadja, hogy szerepel-e egy kulcs a szótárban
- bool ContainsValue( TValue value ): megadja, hogy szerepel-e egy érték a szótárban (true vagy false)
- bool Remove( TKey key ): eltávolít egy elemet a szótárból, a visszatérési érték a művelet sikerességét jelzi
- int Count { get; }: az elemek (kulcsok) száma
- void Clear(): szótár kiürítése
- A szótár elemei a [] operátorral érhetőek el.
- A szótárat foreach ciklussal lehet végig olvasni, amellyel a szótárból KeyValuePair<TKey, TVaule> típusú elemeket kapunk. Ezek Key és Value mezői adják a megfelelő kulcs és érték párokat.
Példa: Hozzunk létre egy 20 elemű tömböt, töltsük fel 1-10 közötti véletlen számokkal! Szótár segítségével számoljuk meg, melyik számból hány darab van! A véletlenszám lesz a kulcs, a számok darabszáma pedig az érték!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
int[] szamok = new int[20]; Random veletlenszam = new Random(); for (int i = 0; i < 20; i++) { szamok[i] = veletlenszam.Next(10); Console.Write("{0,5}", szamok[i]); } //Szótár létrehozása Dictionary<int, int> szamokSzama = new Dictionary<int, int>(); //Megszámoljuk, hogy hányszor fordul elő egy adott szám a tömbben for (int i = 0; i < szamok.Length; i++) { if (szamokSzama.ContainsKey(szamok[i])) { szamokSzama[szamok[i]]++; } else { szamokSzama.Add(szamok[i], 1); } } //Kiíratjuk melyik számból hány volt a tömbben foreach (KeyValuePair<int, int> elem in szamokSzama) { Console.WriteLine(elem.Key.ToString() + ": " + elem.Value + " db"); } |
Gyümölcsök árai példa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace szotaras { class Program { static void Main(string[] args) { Dictionary<string, int> arak = new Dictionary<string, int>(); // Gyümölcsök hozzáadása a szótárhoz arak.Add("alma", 100); arak.Add("körte", 200); arak.Add("barack", 300); // Gyümölcs (kulcs) keresése a szótárban Console.WriteLine("Adj meg egy gyümölcs nevét:"); string gyumolcs = Console.ReadLine(); int ar = 0; if (arak.ContainsKey(gyumolcs)) { ar = arak[gyumolcs]; Console.WriteLine("A(z) {0} ára: {1}", gyumolcs, ar); } else { Console.WriteLine("A kereseett gyümölcs nincs a szótárban!"); } // szótár összes eleme foreach (KeyValuePair<string, int> i in arak) { Console.WriteLine("{0}: {1}", i.Key, i.Value); } // elem törlése arak.Remove("alma"); Console.ReadKey(); } } } |
Halmaz
Gyakorlatilag olyan lista, amiben nem lehetnek azonos elemek, hasonlóan a matematikái halmazokhoz.
- Halmaz létrehozása: HashSet<típus> halmazneve = new HashSet<típus>();
- Halmaz elemekkel kapcsolatos műveletek:
- érték hozzáadása halmazhoz: halmazneve.Add(erték)
- elem eltávolítása a halmazból: halmazneve.Remove(érték)
- halmaz elemeinek törlése: halmazneve.Clear();
- két halmaz uniója: alaphalmaz.UnionWith(halmazvene)
- halmaz elemeinek száma: halmazneve.Count
Példa: Halmaz segítségével generáljunk ötöslottó nyerőszámokat! (5 szám, 1-90 közötti véletlen számok) Majd alakítsuk át tömbbé a halmazt, és rendezzük emelkedő számsorrendbe a számokat!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections.Generic; using System.Linq; namespace halmaz_lotto { class Program { static void Main(string[] args) { HashSet<int> otoslotto = new HashSet<int>(); //új halmaz Random veletlenszam = new Random(); while (otoslotto.Count < 5) otoslotto.Add(veletlenszam.Next(90) + 1); foreach (int szam in otoslotto) Console.Write("{0,5}", szam); int[] nyeroszamok = new int[5]; //új tömb a sorsolt számoknak nyeroszamok = otoslotto.ToArray(); Console.WriteLine(); Console.WriteLine("A nyertes számok növekvő sorrendben: "); Array.Sort(nyeroszamok); for (int i = 0; i < 5; i++) Console.Write("{0,5}", nyeroszamok[i]); Console.ReadKey(); } } } |
Szótár használata listával: Készíts listát, amely 100 db -100…100 közötti számot tartalmaz! Számold meg, melyik számból mennyi van!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
List<int> lista = new List<int>(); Random vsz = new Random(); Console.WriteLine("Lista elemei:"); for (int i = 0; i < 100; i++) { lista.Add(vsz.Next(-100, 101)); if (i % 20 == 0) Console.WriteLine(); Console.Write("{0} ", lista[i]); } Dictionary<int, int> szotar = new Dictionary<int, int>(); //Megszámoljuk, hogy hányszor fordul elő egy adott szám a listában for (int i = 0; i < lista.Count; i++) { if (szotar.ContainsKey(lista[i])) { szotar[lista[i]]++; } else { szotar.Add(lista[i], 1); } } foreach (KeyValuePair<int, int> elem in szotar) { Console.Write(elem.Key.ToString() + ": " + elem.Value + " db"); } |
Szótár használata, például filmek adatainak nyilvántartására. Hozz létre egy szótárt, amelybe filmek címét és a megjelenésük évét tudjuk nyilvántartani. Ebben az esetben a szótár kulcsa string típusú lesz, és a címeket fogja tartalmazni, míg a hozzájuk tartozó értékek az évszámok lesznek.
1 2 3 4 5 6 7 |
Dictionary<string, int> filmek = new Dictionary<string, int>(); filmek.Add("Terminator",1984); filmek.Add("Terminator II.", 1991); filmek.Add("Terminator III.", 2003); filmek.Add("Terminator IV.", 2009); foreach (var f in filmek) Console.WriteLine("Film címe: {0} \tmegjelenés éve: {1}",f.Key,f.Value); |