C#.

C# 람다

Muru 2023. 11. 15. 23:01

람다식:

(매개변수목록) => 식

문 형식의 람다

(매개변수목록 =>
{
	문장1;
	문장2;
	...;
	문장N;
}

무명함수: 람다식으로 만드는 익명메소드

익명 메소드에는 대리자(반환 + 매개변수)로 작성한다.
무명함수를 작성하기 위해서는 먼저, 대리자로 무명함수의 모습을 결정.

delegate int Calculate(int a, int b);

//...

static void Main(string[] args)
{
	Calculate cal = (int a, int b) => a + b;
	Console.WriteLine(cal(1,2)); //결과 3
}

static void Main(string[] args)
{
	delegate int Calculate(int a, int b);
	//...

	Calculate car = **(a, b)** => a + b;
	Console.WriteLine(car(1, 2)); ;
}

delegate void DoSomething();

static void Main(string[] args)
{
	DoSomething Doit ( ) = >
	{
		Console.WriteLine("이게 값이야");
	}
	Doit();
}

=======================================

익명 메서드나 무명메서드에 Func, Action대리자가 유용하다.

namespace ConsoleApp12
{
    enum ItemType
    {
        Weapon,
        Armor,
        Amulet,
        Ring
    }

    enum Rarity
    {
        Normal,
        Uncommon,
        Rare,
    }

    class Item
    {
        public ItemType Itemtype;
        public Rarity Rarity;
    }
    class MainApp
    {
        static List<Item> _items = new List<Item>();
        delegate bool ItemSelector(Item item);

        static bool IsWeapon(Item item)
        {
            return item.Itemtype == ItemType.Weapon;
        }

        static Item FindItem(MyFunc<Item, bool> selector)
        {
            foreach (Item item in _items)
            {
                if (selector(item))
                    return item;
            }
            return null;
        }

        static void Main(string[] args)
        {
            // Lambda : 일회용 함수를 만듦.
            _items.Add(new Item() { Itemtype = ItemType.Weapon, Rarity = Rarity.Normal });
            _items.Add(new Item() { Itemtype = ItemType.Armor, Rarity = Rarity.Uncommon });
            _items.Add(new Item() { Itemtype = ItemType.Ring, Rarity = Rarity.Rare });

           ItemSelector selector = new ItemSelector((Item item) => { return item.ItemType == ItemType.Weapn});

            // Anonymous Function: 무명, 익명 함수
            Item item = FindItem(delegate (Item item) { return item.Itemtype == ItemType.Weapon; });                         
            Item item2 = FindItem((Item item) => { return item.Itemtype == ItemType.Weapon; });

        }
    }
}

static List<Item> _items = new List<Item>();
        delegate Return MyFunc<Return>();
        delegate Return MyFunc<T, Return>(T item);
        delegate Return MyFunc<T1, T2, Return>(T1 t1, T2 t2);

static bool IsWeapon(Item item)
        {
            return item.Itemtype == ItemType.Weapon;
        }

//...

=======================================

namespace ConsoleApp12
{
    enum ItemType
    {
        Weapon,
        Armor,
        Amulet,
        Ring
    }

    enum Rarity
    {
        Normal,
        Uncommon,
        Rare,
    }

    class Item
    {
        public ItemType Itemtype;
        public Rarity Rarity;
    }
    class MainApp
    {
        static List<Item> _items = new List<Item>();

        static bool IsWeapon(Item item)
        {
            return item.Itemtype == ItemType.Weapon;
        }

        static Item FindItem(Func<Item, bool> selector)
        {
            foreach (Item item in _items)
            {
                if (selector(item))
                {
                    return item;
                }
            }
            return null;
        }

        static void Main(string[] args)
        {
            // Lambda : 일회용 함수를 만듦

            _items.Add(new Item() { Itemtype = ItemType.Weapon, Rarity = Rarity.Normal });
            _items.Add(new Item() { Itemtype = ItemType.Armor, Rarity = Rarity.Uncommon });
            _items.Add(new Item() { Itemtype = ItemType.Ring, Rarity = Rarity.Rare });

            // Anonymous Function: 무명, 익명 함수
            Item item = FindItem((Item item) => { return item.Itemtype == ItemType.Weapon; });   

        }
    }