🙇‍♀️Lambda

  • Lambda : 일회용 함수를 만드는데 사용하는 함수

🪐Delegate없이 무기찾기

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

enum Rarity
{
    Nomal,
    Uncommon,
    Rare,
}

class Item
{
    public ItemType ItemType;
    public Rarity Rarity;
}

enum 타입을 가진 ItemType과 Rarity를 가진 class Item

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

    static Item FindWeapon()
    {
        foreach (Item item in _items)
        {
            if (item.ItemType == ItemType.Weapon)
                return item;
        }
        return null;
    }

    static void Main(string[] args)
    {
        _items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
        _items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
        _items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });

        Item item = FindWeapon();
    }
}

  • 아이템 리스트

static List<Item> _items = new List<Item>();

  • 아이템을 삽입
_items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
_items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
_items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });
  • 아이템 찾기
// 각 무기마다 찾는 함수를 만들어 주어야 함
static Item FindWeapon()
{
    foreach (Item item in _items)
    {
        if (item.ItemType == ItemType.Weapon)
            return item;
    }
    return null;
}

// 메인함수에서 사용
Item item = FindWeapon();

Ring을 찾으려면 Ring함수를 다시 만드어야 됨

🪐Delegate로 불편함 줄이기

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

    delegate bool ItemSeletor(Item item);

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

    static Item FindItem(ItemSeletor seletor)
    {
        foreach (Item item in _items)
        {
            if (seletor(item))
                return item;
        }
        return null;
    }

    static void Main(string[] args)
    {
        _items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
        _items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
        _items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });

        Item item = FindItem(IsWeapon);
    }
}
  • delegate 생성

delegate bool ItemSeletor(Item item);

bool값을 반환하는 ItemSeletor라는 이름의 delegate이고 입력은 Item을 받는다

  • delegate 사용하기
static bool IsWeapon(Item item)
{
    return item.ItemType == ItemType.Weapon;
}

static Item FindItem(ItemSeletor seletor)
{
    foreach (Item item in _items)
    {
        if (seletor(item))
            return item;
    }
    return null;
}
  • delegate를 이용해서 foreach문을 간단하게 만듦
  • 하지만 bool값을 반환하는 함수를 만들어줘야 됨 - 콜백할

🪐Lambda 식을 이용해서 일회용 함수 만들기

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

이렇게 만들어 줘야하는 함수를 없앨수 있다

Item item = FindItem(IsWeapon);
// Anonymous Funtion : 무명함수/익명함수
Item item2 = FindItem(delegate (Item item) { return item.ItemType == ItemType.Weapon; });
// Lambda : 일회용 함수를 만드는데 사용하는 함수
Item item3 = FindItem((Item item) => { return item.ItemType == ItemType.Weapon; });
  • Lambda는 무조건 일회용이 아니다!

ItemSeletor seletor = new ItemSeletor((Item item) => { return item.ItemType == ItemType.Weapon; });

이렇게 seletor에 넣을 수 있다

Item item4 = FindItem(seletor); - seletor로 사용 가능

🪐Action, Func

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

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

    static void Main(string[] args)
    {
        _items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
        _items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
        _items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });

        MyFunc<Item, bool> seletor2 = new MyFunc<Item, bool>((Item item) => { return item.ItemType == ItemType.Weapon; });
        MyFunc<Item, bool> seletor3 = (Item item) => { return item.ItemType == ItemType.Weapon; };
    }
}
  • 공용적으로 사용할 수 있는 delegate

  • Action : 반환타입이 없음
  • Func : 반환타입이 있음

  • Lambda와 Func를 사용해 최대한 줄인 코드
class Program
{
    static List<Item> _items = new List<Item>();

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

    static void Main(string[] args)
    {
        _items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
        _items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
        _items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });

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

🪐전체코드

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

    enum Rarity
    {
        Nomal,
        Uncommon,
        Rare,
    }

    class Item
    {
        public ItemType ItemType;
        public Rarity Rarity;
    }

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

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

        static void Main(string[] args)
        {
            _items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
            _items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
            _items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });

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

태그:

카테고리:

업데이트: