예제 #1
0
        public static void Main(string[] args)
        {
            // delegált mint "metódusreferencia gyűjtő"
            // azonos metódusszignatúrájú elemek tárolása

            // szignatúra: visszatérési_típus ____ ( paraméterek_típusa_és_darabszáma )

            // használható a már ismert belerakás
            // illetve helyileg névtelen fgv-t is létre tudunk hozni

            Metodusok methods = new Metodusok(OsszeAd);

            methods += OsszeAd2;


            // "elsütéskor" null ellenőrzése (események alapján)
            methods(10, 20); // OK
            methods -= OsszeAd;
            methods -= OsszeAd2;
            //methods(10, 20); // NEM OK

            // kivédés >> null ellenőrzés kézileg vagy beépített módon
            if (methods != null)
            {
                methods(10, 20);
            }

            methods?.Invoke(10, 20);



            // névtelen függvény használata delegálttal
            methods += delegate(int x, int y)
            {
                Console.WriteLine(x + y);
                return(x + y);
            };



            // =================================================================


            Random     r     = new Random();
            List <int> lista = new List <int>();

            for (int i = 0; i < 10; i++)
            {
                lista.Add(r.Next(100));
            }

            Console.WriteLine("ELEMEK");
            foreach (var item in lista)
            {
                Console.WriteLine(item);
            }


            // névtelen függvény létrehozása
            // helyben, ahol szükség van rá
            // ehhez delegate-et használunk
            // ezt a formát ma már nem igazán használjuk (helyette: lambda)

            int paros_e = lista.Find(ParosE); // metódus is átadható (csak úgy nem igaz ez, itt a Find képes fogadni!)

            Console.WriteLine("\nLISTA KERESÉS DELEGÁLTTAL");
            int keresettParosElem = lista.Find(delegate(int x) {
                return(x % 2 == 0);
            });

            int keresettXElem = lista.Find(delegate(int x) {
                return(x > 10 && x < 82 && x % 2 == 1);
            });

            Console.WriteLine(keresettParosElem);
            Console.WriteLine(keresettXElem);

            List <int> paratlanok = lista.FindAll(delegate(int x)
            {
                return(x % 2 == 1);
            });

            Console.WriteLine();
            foreach (var item in paratlanok)
            {
                Console.WriteLine(item);
            }


            // =================================================================


            Console.WriteLine("\nLISTA KERESÉS LAMBDÁVAL");
            keresettParosElem = lista.Find(x => x % 2 == 0);
            keresettXElem     = lista.Find(x => x > 10 && x < 82 && x % 2 == 1);

            Console.WriteLine(keresettParosElem);
            Console.WriteLine(keresettXElem);
            Console.WriteLine();

            List <Ember> emberLista = new List <Ember>();

            for (int i = 0; i < 10; i++)
            {
                emberLista.Add(new Ember()
                {
                    Nev     = i + ". Jakab Király",
                    Eletkor = r.Next(10, 60)
                });
            }

            List <Ember> keresettek = emberLista.FindAll(x => x.Eletkor < 23);

            foreach (var item in keresettek)
            {
                Console.WriteLine(item);
            }


            // bonyolultabb logika is írható
            emberLista.Find(x =>
            {
                if (x.Eletkor < 40)
                {
                    if (x.Nev[0] == 'B')
                    {
                        return(true);
                    }
                    if (x.Eletkor * Math.Sin(3.0112) < 990)
                    {
                        return(false);
                    }
                }
                else if (x.Eletkor > 50 && x.Eletkor < 55)
                {
                    return(true);
                }
                return(false);
            });

            // =================================================================


            // nem mindig kell nekünk kézzel létrehozni delegáltakat
            // hiszen van erre (is) beépített lehetőség
            // Func < [paraméterek...] , [visszatérés_típusa] >

            Console.WriteLine("\nKONVERTER LAMBDÁVAL FUNC SEGÍTSÉGÉVEL");
            Func <string, int> converter = x => int.Parse(x);

            int a = converter("333");

            Console.WriteLine(a);

            Func <int, int, int> adder = (x, y) => x + y;

            Console.WriteLine("adder func:\t" + adder(10, 11));


            // =================================================================


            Console.WriteLine();
            Action <string> udvozlo = (x => Console.WriteLine(">>> " + x));

            udvozlo += (x => Console.WriteLine("--- " + x));
            udvozlo += (x => Console.WriteLine("::: " + x));
            udvozlo += (x => Console.WriteLine("==> " + x));

            udvozlo?.Invoke("John Wick");



            Console.WriteLine("\n\n");

            Predicate <int> vizsgalat = ParosE;

            Console.WriteLine(vizsgalat(10));
            Console.WriteLine(vizsgalat(11));

            /*
             *
             * > Action is a delegate (pointer) to a method, that takes zero, one or more input parameters, but does not return anything.
             *
             * > Func is a delegate (pointer) to a method, that takes zero, one or more input parameters, and returns a value (or reference).
             *
             * > Predicate is a special kind of Func often used for comparisons.
             *
             * src: https://stackoverflow.com/questions/4317479/func-vs-action-vs-predicate
             *
             * Érdemes a docs.microsoft.com-on is nézelődni!
             *
             */

            Console.WriteLine("\n\n");

            // =================================================================



            // rendezés lambdával

            Ember[] emberek = new Ember[]
            {
                new Ember()
                {
                    Nev = "András", Eletkor = 20
                },
                new Ember()
                {
                    Nev = "Klaudia", Eletkor = 35
                },
                new Ember()
                {
                    Nev = "Barbara", Eletkor = 75
                },
                new Ember()
                {
                    Nev = "János", Eletkor = 12
                }
            };



            foreach (var item in emberek)
            {
                Console.WriteLine("> " + item);
            }

            Array.Sort(emberek, EmberOsszehasonlito);
            // Array.Sort(emberek, (Ember x, Ember y) => x.CompareTo(y));
            // Array.Sort(emberek, (Ember x, Ember y) => x.Eletkor.CompareTo(y.Eletkor));

            foreach (var item in emberek)
            {
                Console.WriteLine("--> " + item);
            }
        }
예제 #2
0
 public static int EmberOsszehasonlito(Ember x, Ember y)
 {
     return(x.CompareTo(y));
 }