Lambda (람다식) : Syntax (문법)

  • 최초 작성일: 2021년 3월 21일(월)

목차

[TOC]

내용

using System;
using System.Collections.Generic;

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

    enum Rarity
    {
        Normal,
        Uncommon,
        Rare
    }
    class Item
    {
        public ItemType ItemType;
        public Rarity Rarity;        

    }
   
    class Program
    {
        static List<Item> _items = new List<Item>();

        //delegate bool ItemSelector(Item item);
        delegate Return MyFunc<T, Return>(T item);
        
        //static bool IsWeapon(Item item)
        //{
        //    return item.ItemType == ItemType.Weapon;
        //}

        //static Item FindItem(ItemSelector selector)
        //static Item FindItem(MyFunc<Item, bool> selector)
        static Item FindItem(Func<Item, bool> selector)
        {
            foreach (Item item in _items)
            {
                if (item.ItemType == ItemType.Weapon)
                //if (selector(item))       // delegate
                    return item;
            }
            return null;
        }

        static void Main(string[] args)
        {
            _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 });

            /*
             * delegate를 직접 선언하지 않아도, 이미 만들어진 애들이 존재한다.
             * -> 반환 타입이 있을 경우 Func 사용
             * -> 반환 타입이 없으면 Action 사용
            */

            // Item item = FindItem(IsWeapon);
            // ItemSelector selector = new ItemSelector((Item item) => { return item.ItemType == ItemType.Weapon; });
            // MyFunc<Item, bool> selector = (Item item) => { return item.ItemType == ItemType.Weapon; };
            // Func<Item, bool> selector = (Item item) => { return item.ItemType == ItemType.Weapon; };
            ///
            ////////////////////////////////////////////////////////////////////////////////////////////////////////
            ///
            // Lambda : 일회용 함수를 만드는데 사용하는 문법이다.
            // Anonymous Function : 무명 함수 /익명 함수

            Item item = FindItem((Item item) => { return item.ItemType == ItemType.Weapon; });

            //Item item = FindItem((Item item) => { return item.ItemType == ItemType.Weapon; });
            //Item item2 = FindItem(delegate (Item item) { return item.ItemType == ItemType.Weapon; });
            //Item item = FindItem(selector);

            Console.WriteLine("ItemType:\t" + item.ItemType);
            Console.WriteLine("Rarity:  \t" + item.Rarity);
        }
    }
}


Result

image