Пример #1
0
        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();
        }
Пример #2
0
        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);
            //}
        }