Monday, May 30, 2016

Negeneričke kolekcije u C# programskom jeziku


Verovatno se sećate šta su nizovi iako sam nizove opisao među prvim postovima C# programskog jezika; pogledajte ovde. Za razliku od nizova kolekcije su vam veći progres od nizova i mnogo se više koriste u programiranju. Tačnije kolekcije predstavljaju skup objekata kojima je moguće pristupati elemenat po elemenat. To u praksi znači da je kolekcija set objekata kojima se pristupa korišćenjem petlje foreach. Razlika između nizova i kolekcija je pre svega u tome što u većini nizova unapred trebate odrediti veličinu, dok to sa kolekcijama nije slučaj. Kolekcije imaju mnogo više funkcionalnosti nego nizovi. Ali pogledajte prvo od čega se sastoji kolekcija.



( Grafički prikaz kolekcija u C# programskom jeziku )

Kolekcije se nalaze u imenskom prostoru System.Collection. Mogu da budu generičke i negeneričke. Generičke kolekcije su parametorizovane, znači moraju imati određen tip podataka i svi elementi u kolekciji moraju biti istog tipa. Generičke kolekcije se za razliku od negenerički kolekcija nalaze u imenskom prostoru System.Collections.Generic i omogućavaju vam type safe i nemate potrebe za konverzijom vaših podataka. Dok negeneričke kolekcije rade sa tipom podataka object. Na taj način vi negeneričke kolekcije možete koristiti da u njih smestite podatke različitog tipa podataka koje možete kasnije koristiti konverzijom istih kastingom. Negeneričke klase nisu type safe i retko se koriste. Svaka kolekcija da bi uopšte bila kolekcija pre svega mora da implementira enumerator koji može da prođe kroz sve elemente u kolekciji. To u prevodu znači da svaka kolekcija koristi interfejse IEnumerable ili interfejs ICollection koji je izveden iz interfejsa IEnumerable dok se obadva interfejsa nalaze u imenskom prostoru System.Collections. Interfejs ICollection koriste sofisticiranije kolekcije, dok vi takođe možete u vašim klasama koristiti koju hoćete. Međutim neke kolekcije koriste i interfejse IList, negeneričku kolekciju stavki kome se može pristupiti preko indeksa ili IDictionary negeneričku listu parova kojima se pristupa kroz ključ ili vrednost. Vi i sami možete da pravite čak vaše kolekcije ukoliko nasledite apstraktnu baznu klasu CollectionBase u vašu klasu. Kolekcije se deklarišu instanciranjem jer kolekcije jesu klase i isto se deklarišu:

Kolekcija MojaKolekcija = new Kolekcija ();


Posle deklaracije možete da vašoj kolekciji dodajete elemente, menjate, brišete i druge aktivnosti u zavisnosti kakvu kolekciju koristite. Negeneričke liste su vam ArrayList, Queue, Stack, Hashtable i SortedList. Pa krenimo redom.

ArrayList kolekcija


ArrayList kolekcija je klasa koja vam omogućava da dinamički dodajete i uklanjate elemente iz niza. Zato za ArrayList kažu da je kolekcija dinamičkog rasta. Ova kolekcija se razlikuje od niza jer nizovi ne dozvoljavaju da menjate dimenzionisanje prilikom inicijalizacije niza. Koristi se kada ne znate kolika je veličina niza ali u isto vreme hoćete da vaša kolekcija sadrži podatke različitih tipova podataka. Pogledajte sledeći primer:

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

namespace ArrayListCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList Employee = new ArrayList();

            Employee.Add("Manuel");
            Employee.Add("Radovanovic");
            Employee.Add("Senior Programmer");
            Employee.Add("5/2/2016");
            Employee.Add(4500.00);

            WriteLine("Information about new employees:" + Environment.NewLine);
           
            Print(Employee);
                                    
            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }

        static void Print(ArrayList arraylist)
        {
            foreach (object item in arraylist)
            {
                DateTime start;
                Double salary;

                if (DateTime.TryParse(item.ToString(), out start))
                {
                    WriteLine(start.ToString("dddd dd MMMM yyyy"));

                }
                else if (Double.TryParse(item.ToString(), out salary))
                {
                    WriteLine("{0:C}", salary);

                }
                else
                {
                    WriteLine(item);

                }
             
            }
        }
    }
}

Kad pokrenete navedeni program, rezultat će biti sledeći:

Information about new employees:

Manuel
Radovanovic
Senior Programmer
Monday 02 May 2016
$4,500.00

Press any key to continue...


Kako navedeni program izgleda možete pogledati i na video-u:



( C# 6.0 Tutorial - Advanced - 24. ArrayList Non Generic Collection )

Queue kolekcija

Queue kolekcija koju u srpskom jeziku prevodimo kao red je kolekcija zasnovana na FIFO – First In First Out strukturi. To znači da kolekcija Queue vraća prvi dodat ili najstariji elemenat dodat iz kolekcije. Kad pomislite na redove, setite se Redo dugmeta. S obzirom da kolekcija ne sadrži metode koje se isto zovu i nazive na koje ste navikli kao na primer Add() metoda, neophodno je da obratite pažnju i naučite nazive metoda koje ova kolekcija koristi. Takođe imajte u vidu da je Count properti i da nije metoda; zato ne koristite male zagrade kada koristite Count.

Count – javni properti koji vraća broj elemenata u kolekciji
Clear() – metoda koja briše sve elemente u kolekciji
Contains() – prepoznaje zadati elemenat ukoliko ga imate u kolekciji
CopyTo() – kopira sve elemente iz kolekcije u zadati niz
Dequeue() – uklanja i vraća prvi elemenat u kolekciji
Enqueue() – dodaje elemenat i stavlja ga zadnjeg u kolekciju
GetEnumerator() – vraća enumerator za redove
Peek() – vraća prvi elemenat iz kolekcije ali ga ne uklanja
ToArray() – kopira sve elemente iz kolekcije u novi niz
. . . 


Pogledajte sledeći jednostavni primer korišćenja redova.


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

namespace QueueCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            Queue queue = new Queue();

            queue.Enqueue("Hello");
            queue.Enqueue("World");
            queue.Enqueue("From");
            queue.Enqueue("A");
            queue.Enqueue("Queue");
            queue.Enqueue("!");
           
            WriteLine($"The Queue collection had these {queue.Count} elements:" + Environment.NewLine);

            Print(queue);

            WriteLine($"The Queue collection have {queue.Count} element, now!" + Environment.NewLine);

            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }

        static void Print(Queue queue)
        {

            int count = queue.Count;
            for (int i = 0; i < count; i++)
            {
                Write(queue.Dequeue() + " ");

            }

            WriteLine(Environment.NewLine);

        }
    }
}

U navedenom primeru smo mogli prikazati i izbrisati sve elemente iz kolekcije i na jednostavniji način, međutim primer na ovakav način prikazuje upotrebu Enqueue i Dequeue metode. Kada pokrenete navedeni program, rezultat će biti sledeći:

The Queue collection had these 6 elements:

Hello World From A Queue !

The Queue collection have 0 element, now!

Press any key to continue...


Kako navedeni program izgleda možete pogledati i na video-u:



( C# 6.0 Tutorial - Advanced - 25. Queue Non Generic Collection )

Stack kolekcija

Stack
kolekcija koju u srpskom jeziku doslovno zovemo stek je kolekcija zasnovana na LIFO – Last In First Out strukturi. To znači da kolekcija Stack vraća zadnji dodat ili najnoviji elemenat dodat iz kolekcije. Kad pomislite na stekove, setite se Undo dugmeta. Ili još bolje pomislite na pranja suđa. Kad stavite prljave tanjire u sudoperu vi kasnije perete od zadnjeg tanjira i prvi tanjir koji ste stavili u sudoperu perete zadnji. Stek kolekcija je identična red kolekciji osim što umesto prvog elementa kolekcija vraća zadnji elemenat. Sve metode Queue kolekcije osim metoda Enqueue i Dequeue; takođe sadrži i Stack kolekcija, stime da stek umesto ove dve metode imaju drugačiji naziv kao metodu Push() koja stavlja elemenat na prvu poziciju ispred svih drugih elemenata dok sa metodom Pop() vraća i uklanja zadnji elemenat koji ste dodali u kolekciju. Najbolje pogledajte sledeći primer kako se koristi Stack kolekcija.

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

namespace StackCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack stack = new Stack();

            stack.Push("First");
            stack.Push("Second");
            stack.Push("Third");
            stack.Push("Fourth");
            stack.Push("Fifth");
           

            WriteLine($"The Stack collection had these {stack.Count} elements:" + Environment.NewLine);

            Print(stack);

            WriteLine($"The Stack collection have {stack.Count} element, now!" + Environment.NewLine);

            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }

        static void Print(Stack stack)
        {

            int count = stack.Count;
            for (int i = 0; i < count; i++)
            {
                WriteLine(stack.Pop());

            }

            WriteLine(Environment.NewLine);

        }
    }
}

Kada pokrenete navedeni program, rezultat će biti sledeći:

The Stack collection had these 5 elements:

Fifth
Fourth
Third
Second
First

The Stack collection have 0 element, now!

Press any key to continue...


Kako navedeni program izgleda možete pogledati i na video-u:


( C# 6.0 Tutorial - Advanced - 26. Stack Non Generic Collection )

Hashtable kolekcija

Kolekcija Hashtable za razliku od prethodnih kolekcija je u stvari vrsta rečnika, poznata pod nazivom mapa ili heš tabela. Programeri ovu kolekciju ne zovu rečnik jer u generičkim klasama imate kolekciju Dictionary – rečnik, pa kad kažete rečnik retko ko pomisli da govorite o heš tabeli. Hashtabe se koristi na principu key/value pair – ključ i vredenost; u situacijama kada je potrebno čuvati objekte kao da su u nizu ali gde je potrebno koristiti drugačiji tip podataka od numeričkog za indeks. Heš tabela može imati i fiksnu veličinu. Pogledajte neke od metoda koje ova kolekcija ima.

Count – properti vraća broj elemenata u heš tabeli
Add(Object, Object) – dodaje elemenat sa specifičnim ključem i vrednošću
Clear() – briše sve elemente iz heš tabele
Clone() – kreira površnu kopiju heš tabele
Contains(Object) – određuje da li heš tabela sadrži specifični ključ
ContainsKey(Object) – isto kao i prethodna metoda
ContainsValue(Object) – određuje da li heš tabela sadrži specifičnu vrednost
CopyTo(Array, Int32) – kopira elemente iz heš tabele u jednodimenzionalan niz instanciran na specifičnom indeksu
Equals(Object) – određuje da li je specifičan objekat isti kao trenutni objekat
GetHash(Object) – vraća heš kod za specifičan ključ
Remove(Object) - uklanja elemenat iz heš tabele na osnovu zadatog ključa
. . .


Sledeći primer ilustruje kako je lako uklanjati elemente iz heš tabele prema ključu, međutim uklanjanje elementa iz heš tabele prema vrednosti zahteva razmišljanje i dovitljivost jer se na taj način uklanjanje elemenata iz heš tabele ne preporučuje. Međutim, možete doći u situaciju da vam baš to treba. Ja sam to pokušao na ovaj način, čisto radi demonstracije i radi.


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

namespace HashtableCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            Hashtable employee = new Hashtable();

            employee.Add("M0127", "Amanda Scott");
            employee.Add("M0245", "Dennis Brant");
            employee.Add("P0222", "Manuel Radovanovic");
            employee.Add("M0301", "Mike Warner");
            employee.Add("P0402", "Olivia Morton");
          
            WriteLine($"The Hashtable collection had these {employee.Count} elements:" + Environment.NewLine);

            Print(employee);

            WriteLine("Remove the employee by the key: M0301" + Environment.NewLine);

            employee.Remove("M0301");

            Print(employee);

            WriteLine("Remove the employee by the value: Dennis Brant" + Environment.NewLine);

            RemoveEmployee(employee, "Dennis Brant");
           
            Print(employee);

            WriteLine($"The Hashtable collection have {employee.Count} elements, now!" + Environment.NewLine);

            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }

        static void Print(Hashtable hashtable)
        {
            foreach (DictionaryEntry entry in hashtable)
            {
                WriteLine($"Code: {entry.Key} - {entry.Value}");

            }
          
            WriteLine();

        }

        static void RemoveEmployee(Hashtable hashtable, object value)
        {
            object key = null;
            foreach (DictionaryEntry entry in hashtable)
            {
                if (entry.Value == value) key = entry.Key;

            }

            if (key != null) hashtable.Remove(key);
        }
    }
}

Kada pokrenete navedeni program, rezultat će biti sledeći:

The Hashtable collection had these 5 elements:

Code: M0245 - Dennis Brant
Code: P0222 - Manuel Radovanovic
Code: P0402 - Olivia Morton
Code: M0301 - Mike Warner
Code: M0127 - Amanda Scott

Remove the employee by the key: M0301

Code: M0245 - Dennis Brant
Code: P0222 - Manuel Radovanovic
Code: P0402 - Olivia Morton
Code: M0127 - Amanda Scott

Remove the employee by the value: Dennis Brant

Code: P0222 - Manuel Radovanovic
Code: P0402 - Olivia Morton
Code: M0127 - Amanda Scott

The Hashtable collection have 3 elements, now!

Press any key to continue...


Kako navedeni program izgleda možete pogledati i na video-u:

 

( C# 6.0 Tutorial - Advanced - 27. Hashtable Non Generic Collection )

SortedList kolekcija

Da poznajete generičke klase pomislili bi ste da je SortedList kolekcija slična generičkoj klasi List<> samo što sortira elemente. Međutim, SortedList je kolekcija slična Hashtable kolekciji ali s time da vrši sortiranje prema ključu ili indeksu. SortedList kolekcija to postiže zato što ima implementiran IComparable interfejs nad svojim ključem prilikom kreiranja SortedList-e. Pogledajte sledeći primer i upamtite da SortedList sortira elemente prema ključu a ne prema vrednosti.

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

namespace SortedListCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            SortedList employee = new SortedList();

            employee.Add(1, "Amanda Scott");
            employee.Add(3, "Manuel Radovanovic");
            employee.Add(4, "Mike Warner");
            employee.Add(2, "Dennis Brant");
            employee.Add(5, "Olivia Morton");

            WriteLine($"The Sortedlist collection had these {employee.Count} sorted elements by the key:" + Environment.NewLine);

            Print(employee);
                      
            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }

        static void Print(SortedList sortedlist)
        {
            foreach (DictionaryEntry entry in sortedlist)
            {
                WriteLine(entry.Key + " " + entry.Value);

            }

            WriteLine();

        }
    }
 }

Kada pokrenete navedeni program, rezultat će biti sledeći:

The Sortedlist collection had these 5 sorted elements by the key:

1 Amanda Scott
2 Dennis Brant
3 Manuel Radovanovic
4 Mike Warner
5 Olivia Morton

Press any key to continue...


Kako navedeni program izgleda možete pogledati i na video-u:

 
( C# 6.0 Tutorial - Advanced - 28. SortedList Generic Collection )

Kako da napravim od klase svoju kolekciju?

Kao što sam već naveo vi možete da pravite vaše kolekcije ukoliko nasledite apstraktnu baznu klasu CollectionBase u vašu klasu. Najbolje pogledajte sledeći primer u kome ću vam pokazati kako na primer možete napraviti kolekciju u kojoj će te zapisati nazive serija X-Files. Prvo pravite klasu koja sadrži javni član tipa string za naziv čuvene televizijske serije.

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

namespace MyOwnCollection
{
    class XFile
    {
        public string Name;

        public XFile ()
        {

        }
    }
}

Zatim pravite klasu koja predstavlja kolekciju. Obratite pažnju na klasu CollectionBase koju vaša klasa za kolekciju nasleđuje. Nasleđivanjem iste, vi već dobijate nekoliko korisnih metoda u vašoj klasi ali za dodavanje i uklanjanja elemenata iz vaše kolekcije morate sami napraviti metode koje to obavljaju.

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

namespace MyOwnCollection
{
    class XFileCollection : System.Collections.CollectionBase
    {
        public void Add(XFile xfile)
        {
            List.Add(xfile);

        }

        public void Remove(int index)
        {
            if (index > Count - 1 || index < 0)
            {
                System.Console.WriteLine("Index not valid!");
            }
            else
            {
                List.RemoveAt(index);
            }
        }

        public XFile Item(int Index)
        {
            return (XFile)List[Index];

        }
    }
}

I to je sve, odmah možete da koristite vašu kolekciju u programu:

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

namespace MyOwnCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            XFileCollection XFiles = new XFileCollection();
                               
            // Add some elements into the collection
            XFile xf1 = new XFile();
            xf1.Name = "Pilot";
            XFiles.Add(xf1);

            XFile xf2 = new XFile();
            xf2.Name = "Deep Throad";
            XFiles.Add(xf2);

            XFile xf3 = new XFile();
            xf3.Name = "Squeese";
            XFiles.Add(xf3);

            WriteLine("Added X-Files television series");
            WriteLine($"In collection are {XFiles.Count} items." + Environment.NewLine);
            Print(XFiles);

            // Remove some element from the collection
            WriteLine(Environment.NewLine + "Remove the second serial");
            XFiles.RemoveAt(1);
            WriteLine($"In collection are {XFiles.Count} items." + Environment.NewLine);
            Print(XFiles);
           
            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();
           
        }

        static void Print( XFileCollection XFiles)
        {
            int counter;
            for (counter = 0; counter < XFiles.Count; counter++)
            {
                WriteLine(XFiles.Item(counter).Name);

            }        
        }
    }
}
 
Kada pokrenete navedeni program, rezultat će biti sledeći:

Added X-Files television series
In collection are 3 items.

Pilot
Deep Throad
Squeese

Remove the second serial
In collection are 2 items.

Pilot
Squeese

Press any key to continue... 


Kako navedeni program izgleda možete pogledati i na video-u: 



( C# 6.0 Tutorial - Advanced - 29. How to make your own collection )

                 

2 comments:

  1. Postovani, da li se broj clanova GENERICKE liste dobija koriscenjem svojstva Count, Lenght ili metode Number. Kada su u pitanju negenericke koristi se Count ako sam dobro razumela :) pozdrav

    ReplyDelete