static void Main(string[] args) { var bejarhatoOsztaly = new BejarhatoOsztaly <SajatOsztaly>(); bejarhatoOsztaly.Add(new SajatOsztaly("Elso bejegyzes")); bejarhatoOsztaly.Add(new SajatOsztaly("Masodik bejegyzes")); bejarhatoOsztaly.Add(new SajatOsztaly("Harmadik bejegyzes")); bejarhatoOsztaly.Add(new SajatOsztaly("Negyedik bejegyzes")); foreach (var item in bejarhatoOsztaly) { Console.WriteLine(item.Uzenet); //A bejaro nem teljes gyujtemenyeleres, ezert iyet nem tehetunk: //bejarhatoOsztaly.Remove(item); //De ha megis: bejarhatoOsztaly.Remove(item); //tudnom kell arrol, hogy ha az adatokat modositjak, //nem ertesulok rola, es csak akkor tudok ellene tenni, //ha erre a forgatokonyvre felkeszulok: //1. Nem teszunk listat a kirakatba (nem tesszuk elerhetove a lista adatainkat kivulrol) //2. Igy ertesulunk a modositasrol, es kezelni tudjuk //3. Helyzettol fugg, hogy engedjuk -e a modositast, es ertesitjuk a bejaro(ka)t, vagy mar a modositast sem engedjuk //4. Parhuzamos bejarasokra a sajat bejaroval lehet a legegyszerubben felkeszulni //5. Ha a bejaro es a bejarhato egy osztalyba kerul, akkor a dispose() implaemntacioja tul bonyolult lehet } //Miutan a foreach veget er, megivja a Dispose() fgvt. //A foreach a kovetkezo mechanizmust hivja eletre: //using (var bejaro = bejarhatoOsztaly.GetEnumerator())//a bejaro IDisposable, ezert using blokkban kell hasznalni //var bejaro = bejarhatoOsztaly.GetEnumerator(); //try //{ // var leszKovetkezo = true; // do // { // leszKovetkezo = bejaro.MoveNext(); // var item = bejaro.Current; // { // //Ez itt a foreach ciklus belseje // Console.WriteLine(item.Uzenet); // } // } while (leszKovetkezo); //} //finally //{ // if (bejaro!=null) // { // ((IDisposable)bejaro).Dispose(); // } //} ////Nagyon fontos annak kezelese, hogy a bejarhato peldeny elemei modosultak -e? ////Mert ha igen, akkor valamit tenni kell. A List<T> Enumerator-a peldaul exception-t dob //var lista = new List<string>(new string[] { "egy", "ketto", "harom" }); ////var lista = new List<string>() { "egy", "ketto", "harom" }; //ugyanaz, mint elobb //foreach (var item in lista) //{ // Console.WriteLine($"elem: {item}"); // lista.Remove(item); //--> //--> System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.' //} Console.ReadLine(); }
static void Main(string[] args) { var bejarhatoOsztaly = new BejarhatoOsztaly <SajatOsztaly>(); bejarhatoOsztaly.Add(new SajatOsztaly("első bejegyzés")); bejarhatoOsztaly.Add(new SajatOsztaly("második bejegyzés")); bejarhatoOsztaly.Add(new SajatOsztaly("harmadik bejegyzés")); bejarhatoOsztaly.Add(new SajatOsztaly("negyedik bejegyzés")); foreach (var item in bejarhatoOsztaly) { Console.WriteLine("elem: {0}", item.Uzenet); //a bejáró nem teljes gyűjteményelérés, ezért ilyet nem tudok mondani: //bejarhatoOsztaly.Remove(item); //DE HA MÉGIS: bejarhatoOsztaly.Remove(item); //tudnom kell arról, hogy ha az adatokat módosítják, //nem értesülök róla, és csak akkor tudok ellene tenni, //ha erre a forgatókönyvre felkészülök. //1. Nem teszünk listát az ablakba (nem tesszük elérhetővé a lista // adatainkat kívülről //2. Így értesülünk a módosításról, és kezelni tudjuk //3. Helyzettől függ, hogy engedjük a módosítást és értesítjük a bejáró(kat), vagy // vagy már a módosítást sem engedjük //4. Párhuzamos bejárásokra a saját bejáróval lehet a legegyszerűbben felkészülni //5. Ha a bejáró és a bejárandó egy osztályba kerül, akkor a dispose implementációja érdekes lehet } //Miután a foreach véget ér, meghívja a Dispose-t. //a foreach a következő mechanizmust hívja életre: //using (var bejaro = bejarhatoOsztaly.GetEnumerator()) is kifejtve: //var bejaro = bejarhatoOsztaly.GetEnumerator(); //try //{ // var leszKovetkezo = true; // do // { // leszKovetkezo = bejaro.MoveNext(); // var item = bejaro.Current; // { // //ez itt a ciklus belseje // } // } while (leszKovetkezo); //} //finally //{ // if (bejaro!=null) // { // ((IDisposable)bejaro).Dispose(); // } //} //var lista = new List<string>(new string[] { "egy", "kettő", "három" }); ////Nagyon fontos annak kezelése, hogy a bejárható példány elemei módosultak-e? ////mert ha igen, akkor valamit tenni kell. ////a List<T> Enumerator-a például ilyenkor exception-t dob: ////System.InvalidOperationException: Collection was modified; enumeration operation may not execute. //foreach (var item in lista) //{ // Console.WriteLine("elem: {0}", item); // lista.Remove(item); //} }