Pisanje programa koji koristi red (Queue)
Primer je rađen praćenjem sličnog primera sa sledeće web strane:
https://www.c-sharpcorner.com/UploadFile/219d4d/queue-collection-and-stack-collection-class-in-C-Sharp/
Generička klasa ( među kolekcijama ): Queue
Red (Queue) je kolekcija tipa "First in First Out" (FIFO) iz prostora imena System.Collections.Generic.
( da bi se koristio red, treba vam na početku: #using System.Collections.Generic; )
U nastavku radimo primer:
1 - Kreirati novu konzolnu aplikaciju i u nju dodati klasu “Zaposleni” sa dva automatski inplementirana propertija
class Zaposleni
{
public int Id { get; set; }
public string Ime { get; set; }
}
U istom fajlu kreirati još jednu klasu u kojoj će biti naš glavni program:
class Program
{
static void Main(string[] args)
{
}
}
U ovoj glavnoj metodi Main kreirati tri objekta klase Zaposleni
static void Main(string[] args)
{
Zaposleni zaposleni1 = new Zaposleni()
{
Id = 1,
Ime = "Andrija"
};
Zaposleni zaposleni2 = new Zaposleni()
{
Id = 2,
Ime = "Jova"
};
Zaposleni zaposleni3 = new Zaposleni()
{
Id = 3,
Ime = "Pera"
};
}
Da bi se kreirala lista zaposlenih, koristili bismo sledeće:
List<Zaposleni> listaZaposlenih = new List<Zaposleni>();
gde je u stvari tip podataka: Zaposleni
Na isti način se kreira red zaposlenih:
Queue<Zaposleni> redZaposlenih = new Queue<Zaposleni>();
Kako se koristi Metoda Enqueue:
U listi smo za dodavanje elemenata na kraj liste koristili metodu Add. Kod reda se za dodavanje elemenata na kraj reda, jedan iza drugog, koristi metoda Enqueue.
Queue<Zaposleni> redZaposlenih = new Queue<Zaposleni>();
redZaposlenih.Enqueue(zaposleni1);
redZaposlenih.Enqueue(zaposleni2);
redZaposlenih.Enqueue(zaposleni3);
Kako se koristi Metoda Dequeue?
Da bismo dodali nešto u red koristimo metodu Enqueue. Da bi nešto "izašlo" iz reda koristimo metodu Dequeue.
PAŽNJA: ako opotrebite ovu metodu, stavka koju dobijete je izvađena iz reda i više se ne nalazi u njemu !
int komadaPreEnqueue = redZaposlenih.Count;
Console.WriteLine("U redu je pre Dequeue bilo {0}",komadaPreEnqueue);
Zaposleni zap1 = redZaposlenih.Dequeue();
Console.WriteLine(zap1.Id+" "+zap1.Ime);
int komadaPosleDequeue = redZaposlenih.Count;
Console.WriteLine("U redu je posle Dequeue bilo {0}", komadaPosleDequeue);
Sada treba pokrenuti aplikaciju:
Na izlazu će biti prikazano da je pre nego što se uradi Dequeue bilo 3 elementa, a posle će da piše da je u redu 2 elementa ! Element koji je dobijen je u stvari elementkoji je prvi ubačen u red.
Nakon prvog poziva metoda Dequeue, ono što je bilo na drugom mestu je sada na prvom.
-
( to vam je kao da čekate u redu za sladoled - ko je prvi stigao, pre će biti poslužen. )
Ako bismo ponovo upotrebili metodu Dequeue, dobili bismo sledeći po redu element a u redu bi ostao onaj treći element:
Zaposleni zap2 = redZaposlenih.Dequeue();
Console.WriteLine(zap2.Id+" "+zap2.Ime);
int komadaPosleDequeue = redZaposlenih.Count;
Console.WriteLine("U redu je posle Dequeue bilo {0}", komadaPosleDequeue);
I sada, šta će se desiti ako se pokrene aplikacija ? (otkrijte sami)
Petlja foreach
Način da se preuzmu svi elementi iz neke kolekcije (niz, lista, red, ...) čak i ako ne znamo koliko elemenata ćemo da dobijemo - za to se koristi foreach.
Ono što je zgodno u primeni petlje foreach - proći će kroz sve elemente u kolekciji ali ih neće izbaciti iz kolekcije !
foreach(Zaposleni zap in redZaposlenih)
{
Console.WriteLine(zap.Id + " "+zap.Ime);
}
Peek (hajde da provirimo šta tamo ima )
Ako želimo samo da vidimo šta bi bilo sledeće na redu da izađe iz reda, a da taj element ne uklonimo iz reda, u prevodu, da provirimo, koristimo metod Peek.
int komadaPrePeek = redZaposlenih.Count();
Console.WriteLine("Komada pre Peek {0}", redZaposlenih.Count);
Zaposleni zapVirim = redZaposlenih.Peek();
Console.WriteLine(zapVirim.Ime);
int komadaPoslePeek = redZaposlenih.Count();
Console.WriteLine("Komada posle Peek {0}", redZaposlenih.Count);
Šta će se desiti ako se pokrene aplikacija ? (otkrijte sami)
U nastavku je programski kod primera koji je rađen na času:
using System;
using System.Collections.Generic;
using System.Linq;
class Zaposleni
{
public int Id { get; set; }
public string Ime { get; set; }
}
class Program {
static void Main(string[] args)
{
Zaposleni zaposleni1 = new Zaposleni()
{
Id = 1,
Ime = "Andrija"
};
Zaposleni zaposleni2 = new Zaposleni()
{
Id = 2,
Ime = "Jova"
};
Zaposleni zaposleni3 = new Zaposleni()
{
Id = 3,
Ime = "Pera"
};
Queue<Zaposleni> redZaposlenih = new Queue<Zaposleni>();
redZaposlenih.Enqueue(zaposleni1);
redZaposlenih.Enqueue(zaposleni2);
redZaposlenih.Enqueue(zaposleni3);
#region Dequeue metoda
int komadaPreDequeue = redZaposlenih.Count;
Console.WriteLine("U redu je pre Dequeue bilo {0}", komadaPreDequeue);
Zaposleni zap1 = redZaposlenih.Dequeue();
Console.WriteLine(zap1.Id + " " + zap1.Ime);
int komadaPosleDequeue = redZaposlenih.Count;
Console.WriteLine("U redu je posle Dequeue bilo {0}", komadaPosleDequeue);
Zaposleni zap2 = redZaposlenih.Dequeue();
Console.WriteLine(zap2.Id + " " + zap2.Ime);
int komadaPoslePrvogDequeue = redZaposlenih.Count;
Console.WriteLine("U redu je posle drugog Dequeue bilo {0}", komadaPoslePrvogDequeue);
#endregion
#region foreach petlja
foreach (Zaposleni zap in redZaposlenih)
{
Console.WriteLine(zap.Id + " " + zap.Ime);
}
#endregion
#region peek metoda
int komadaPrePeek = redZaposlenih.Count();
Console.WriteLine("Koliko ih je pre Peek : {0}", komadaPrePeek);
Zaposleni zaposleniPeek = redZaposlenih.Peek();
Console.WriteLine(zaposleniPeek.Ime);
int komadaPoslePeek = redZaposlenih.Count();
Console.WriteLine("Koliko ih je nakon Peek : {0}", komadaPoslePeek);
#endregion
}
}
Zanimljivost: Kada se koristi #region i završi sa #endregion, taj deo se u editoru može "skupiti" ili ponovo staviti u fokus sa "+" ili "-", radi bolje preglednosti
Naravno, ako radite u Vizual Studiju, na kraju dodajte Console.ReadKey();