내일배움캠프 15일차 TIL <C# LINQ 함수 > 04/25

정광훈(Unity_9기)·2025년 4월 25일

TIL (Today I Learned)

목록 보기
26/110
post-thumbnail

LINQ 함수

  • Where() - 조건에 맞는 요소만 필터링

  • Any() - 조건에 맞는 요소가 있는지 확인 - 조건을 만족하는게 하나라도 있는지 확인

  • => (람다): 익명 함수라고도 하는 람다 표현식은 이름이 없는 함수다.
    필요할 때 즉석에서 간단한 함수를 정의하고 사용

  • ToList()/ToArray() - LINQ 결과를 리스트나 배열로 변환


 List<Equipment.Weapon> NoWeapon = Shop.storeWeapons.Where(weapon =>
 !Equipment.Inventory.Any(owned => owned.Name == weapon.Name)).ToList();
  • Shop.storeWeapons: 무기 상점

  • .Where(weapon => : weapon은 Shop.storeWeapons의 무기를 뜻하는 변수

  • Equipment.Inventory: 무기 인벤토리

  • .Any(owned => : owned는 Equipment.Inventory의 무기 인벤토리를 뜻하는 변수

  • owned.Name == weapon.Name): 인벤토리 무기 이름와 상점 무기의 이름이 같다면 을 의미

  • .ToList(): 앞의 조건에 부합하는 무기들의 목록을 가져오라는 의미

  • !Equipment.Inventory.Any(owned => owned.Name == weapon.Name))

: 인벤토리에 소지중인 무기의 이름과 상점 무기 이름이 하나라도 같은게 있는가?

있으면 true 없으면 false 반환, 하지만 앞에 !로 출력이 반대가 된다.

쉽게 말해 해당 상점 무기랑 같은 무기가 인벤토리에 하나라도 없을 때 참이 되는 것.

ex)

검을 가지고 있으면 상점 무기들 중 검만 제외한 모든 무기를 불러온다.

Shop.storeWeapons.Where(weapon =>
 !Equipment.Inventory.Any(owned => owned.Name == weapon.Name))

상점 무기 중 저 조건에 해당하는 아이템만 걸러내는 필터역할이 된다.

 List<Equipment.Weapon> NoWeapon = Shop.storeWeapons.Where(weapon =>
 !Equipment.Inventory.Any(owned => owned.Name == weapon.Name)).ToList()

Equipment.Weapon 기반으로 상점의 모든 무기 중에서,

플레이어의 인벤토리에 아직 없는 무기들만의 목록을 만들어서

NoWeapon이라고 리스트 이름을 만든 것이다.


<Deonseon.cs>

        private void GetRewards()
        {
            foreach (var reward in rewards) // rewards 리스트에 있는 보상 목록
            {
                reward.GetReward(); // Reward.cs에 있는 GetReward에서 보상을 받음
            }
            DropItem(); // 아이템 보상
        }

        // 던전 클리어 후 아이템 보상
        private void DropItem()
        {
            Random rand = new Random();

            //인벤토리에 없는 아이템 리스트 - 상점의 모든 아이템 중에서, 플레이어의 인벤토리에 아직 없는 아이템 목록
            List<Equipment.Weapon> NoWeapon = Shop.storeWeapons.Where(weapon => !Equipment.Inventory.Any(owned => owned.Name == weapon.Name)).ToList();
            List<Equipment.Armor> NoArmor = Shop.storeArmors.Where(armor => !Equipment.ArmorInventory.Any(owned => owned.Name == armor.Name)).ToList();

            if (NoWeapon.Count > 0) // 소지하지 않은 무기의 수 > 0
            {
                int randDrop = rand.Next(1, 101); // 무기 드랍 확률
                int itemDrop = rand.Next(1, 101); // 무기와 방어구 중 하나 드랍 확률

                if (randDrop <= 20) // 아이템 드랍률 20%
                {
                    if (itemDrop > 50) // 무기 드랍률 50%
                    {
                        int randnum = rand.Next(0, NoWeapon.Count); // 인벤토리에 없는 무기 개수 만큼
                        Equipment.Weapon reWeapon = NoWeapon[randnum]; // 보상 무기 = 내가 소지하고 있지 않은 무기
                        rewards.Add(new WeaponReward(reWeapon)); // 내가 소지하지 않은 무기를 보상 리스트에 추가
                        new WeaponReward(reWeapon).GetReward();

                        Console.WriteLine($"보상으로 '{reWeapon.Name}'을 획득했습니다!");
                    }
                    else // 방어구 드랍률 50%
                    {
                        int randnum = rand.Next(0, NoArmor.Count); // 인벤토리에 없는 방어구 개수 만큼
                        Equipment.Armor reArmor = NoArmor[randnum]; // 보상 방어구 = 내가 소지하고 있지 않은 방어구
                        rewards.Add(new ArmorReward(reArmor)); // 내가 소지하지 않은 방어구를 보상 리스트에 추가
                        new ArmorReward(reArmor).GetReward();

                        Console.WriteLine($"보상으로 '{reArmor.Name}'을 획득했습니다!");
                    }
                }
            }
        }
<Reward.cs>

    public abstract class Reward // 보상 추상 클래스
    {
        public abstract void GetReward();
    }

    public class GoldReward : Reward // 골드 보상
    {
        public int GetGold { get; }

        public GoldReward(int getGold) // 생성자
        {
            GetGold = getGold;
        }

        public override void GetReward() // 보상 받기 메서드
        {
            Player.Gold += GetGold; // 던전 클리어 골드를 플레이어 골드에 합침
        }
    }

    public class WeaponReward : Reward // 무기 보상
    {
        public Weapon Weapon { get; }

        public WeaponReward(Weapon weapon) // 생성자
        {
            Weapon = weapon;
        }

        public override void GetReward() // 보상 받기 메서드
        {
            Equipment.Inventory.Add(Weapon); // 인벤토리에 보상 추가
        }

        public class ArmorReward : Reward // 방어구 보상
        {
            public Armor Armor { get; }

            public ArmorReward(Armor armor) // 생성자
            {
                Armor = armor;
            }

            public override void GetReward() // 보상 받기 메서드
            {
                Equipment.ArmorInventory.Add(Armor); // 인벤토리에 보상 추가
            }
        }
    }

0개의 댓글