[Web Server] 섹션 3. 고급 C# 문법 - 12. LINQ #1

데이터를 가공할 때 유용하게 쓸 수 있는 문법이다!

SQL 문법과 비슷하고 가독성이 좋아 기능을 쉽게 파악할 수 있다는 것이 장점이다.

 

근데 유니티에서 LINQ 쓰면 오류날 수도 있어서...(특히 ios) 별로 추천하진 않는다고 한다...(초창기에 그랬다고 함)

근데 LINQ를 기반으로 하는 기술들이 많아서, 공부할 가치가 있다

 

using System.Threading.Tasks;
using System;

namespace TaskPractice
{
    public enum ClassType
    {
        Knight,
        Archer,
        Mage,
    }

    public class Player
    {
        public ClassType ClassType { get; set; }
        public int Level { get; set; }
        public int Hp { get; set; }
        public int Attack { get; set; }
    }

    class Program
    {
        static List<Player> _players = new List<Player>();

        static async Task Main(string[] args)
        {
            Random random = new Random();

            for (int i = 0; i < 100; i++)
            {
                ClassType classType = (ClassType)random.Next(0, 3);
                int level = random.Next(1, 100);
                int hp = random.Next(100, 1000);
                int attack = random.Next(5, 50);
                Player player = new Player
                {
                    ClassType = classType,
                    Level = level,
                    Hp = hp,
                    Attack = attack
                };
                _players.Add(player);
            }


            // 레벨이 50이상인 Knight만 추려내서
            // 레벨을 오름차순으로 순서로 정렬
            // 기존 방법
            List<Player> players = GetHighLevelKnights();
            foreach (Player player in players)
            {
                Console.WriteLine($"ClassType : {player.ClassType}, Level : {player.Level}, Hp : {player.Hp}, Attack : {player.Attack}");
            }

            Console.WriteLine("===================================");

            // LINQ 사용 방법
            List<Player> linqPlayers = GetHighLevelKnightsByLinq();
            foreach (Player player in linqPlayers)
            {
                Console.WriteLine($"ClassType : {player.ClassType}, Level : {player.Level}, Hp : {player.Hp}, Attack : {player.Attack}");
            }
        }


        // 기존 방법
        static public List<Player> GetHighLevelKnights()
        {
            List<Player> players = new List<Player>();
            foreach (var player in _players)
            {
                if (player.ClassType != ClassType.Knight)
                    continue;

                if (player.Level < 50)
                    continue;

                players.Add(player);
            }

            players.Sort((p1, p2) => p1.Level.CompareTo(p2.Level));

            return players;
        }

        // LINQ 사용 방법
        static public List<Player> GetHighLevelKnightsByLinq()
        {
            // from : foreach 역할
            // where : 필터 역할(조건에 부합하는 데이터만 걸러냄)
            // orderby : 정렬 역할(ascending / descending)
            // select : 최종 결과 추출. 가공해서 추출할지도 결정 가능. ex) player.Hp
            //          Anonymous Type 으로 추출 가능. ex) new { Hp = player.Hp, Level = player.Level * 2 }

            var players = from player in _players
                          where player.ClassType == ClassType.Knight && player.Level >= 50
                          orderby player.Level ascending
                          select player;
            return players.ToList();
        }
    }
}

 

 

 


출처

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part6: 웹 서버 강의 | Rookiss - 인프런