💡 LINQ?

C# 언어에 직접 쿼리 기능을 통합하는 방식을 기반으로 하는 기술 집합 이름입니다. 쿼리는 데이터 소스에서 데이터를 검색하는 식입니다. 쿼리는 일반적으로 특수화된 쿼리 언어로 표현됩니다.

 

Language-Integrated Query (LINQ) (C#)

Learn about Language-Integrated Queries (LINQs) and review an example of the complete query operation.

learn.microsoft.com

 

📝 LINQ 사용

  • 예제를 통해 LINQ를 어떤 상황에 사용하면 좋을지 비교하여 확인해보겠습니다.

 

· 준비작업

  • 아래의 스크립트를 이용하여 Player의 정보를 담는 리스트를 무작위로 생성합니다.
namespace Study
{
    class Program
    {
        public enum ClassType
        {
            Knight,
            Archer,
            Mage
        }

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

        static List<Player> _player = new List<Player>();

        static void Main(string[] args)
        {
            Random rand = new Random();

            for (int i = 0; i < 100; ++i)
            {
                _player.Add(
                new Player()
                {
                    ClassType = (ClassType)rand.Next(0, 3),
                    Level = rand.Next(0, 100),
                    Hp = rand.Next(100, 1000),
                    Attack = rand.Next(50, 100),
                }
                );
            }

            foreach (Player player in _player )
            {
                Console.WriteLine($"LEVEL:{player.Level}, HP:{player.Hp}, TYPE:{player.ClassType}");
            }
        }
    }
}

 

· 예제

  • 수행해야 하는 목표는 다음과 같습니다.
  • "레벨이 50 이상인 Knight만 추출하여 레벨을 오름차순으로 정렬하세요.

 

· 일반적으로 함수를 구현하는 방법

  • 함수를 구현하여 해결합니다.
static public List<Player> GetKnights()
{
    List<Player> players = new List<Player>();

    foreach (Player player in _player)
    {
        if (player.ClassType != ClassType.Knight) { continue; }
        if (player.Level < 50) { continue; }

        players.Add(player);
    }

    players.Sort((lhs, rhs) => { return lhs.Level - rhs.Level; });

    return players;
}
  • 일반적으로 생각할 수 있는 방법입니다.
  • 이 함수의 의도를 단번에 파악하기는 어렵습니다.
  • 개발자의 코딩 스타일에 따라 같은 결과일지라도 작성하는 스타일이 다를 수 있습니다.
  • 필요에따라 별도의 함수를 여러개 선언해야합니다.

 

· LINQ를 사용하여 구현

  • LINQ 쿼리문을 사용하여 구현합니다.
var players =
    from p in _player                                           //_player을 p로 이름을 지어서 사용하도록
    where p.ClassType == ClassType.Knight && p.Level >= 50      //필터 역할(조건)
    orderby p.Level                                             //p.Level을 기준으로 orderby 'ascending' 기본값, 'descending' 내림차순
    select p;                                                   //최종 결과를 추출
  • 개발자의 코딩 스타일에 관계없이 동일한 쿼리문을 작성해야하기에 비슷한 스타일로 작성됩니다.
  • 약속된 쿼리문의 형태로 의도를 정확하게 파악할 수 있습니다.

 

👍 전체 스크립트

전체 스크립트 보기
namespace Study
{
    class Program
    {
         public enum ClassType
        {
            Knight,
            Archer,
            Mage
        }

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

        static List<Player> _player = new List<Player>();

        static void Main(string[] args)
        {
            Random rand = new Random();

            for (int i = 0; i < 100; ++i)
            {
                _player.Add(
                new Player()
                {
                    ClassType = (ClassType)rand.Next(0, 3),
                    Level = rand.Next(0, 100),
                    Hp = rand.Next(100, 1000),
                    Attack = rand.Next(50, 100),
                }
                );
            }

            //Q. 레벨이 50 이상인 Knight만 추출하여 레벨을 오름차순으로 정렬하세요

            //A1. 일반적인 함수 구현 방법
            {
                List<Player> players = GetKnights();

                foreach (Player player in players)
                {
                    Console.WriteLine($"LEVEL:{player.Level}, HP:{player.Hp}, TYPE:{player.ClassType}");
                }
            }

            Console.WriteLine("\n\n");

            //A2. LINQ
            {
                var players =
                    from p in _player                                           //_player을 p로 이름을 지어서 사용하도록
                    where p.ClassType == ClassType.Knight && p.Level >= 50      //필터 역할(조건)
                    orderby p.Level                                             //p.Level을 기준으로 orderby 'ascending' 기본값, 'descending' 내림차순
                    select p;                                                   //최종 결과를 추출

                foreach (Player player in players)
                {
                    Console.WriteLine($"LEVEL:{player.Level}, HP:{player.Hp}, TYPE:{player.ClassType}");
                }
            }
        }

        static public List<Player> GetKnights()
        {
            List<Player> players = new List<Player>();

            foreach (Player player in _player)
            {
                if (player.ClassType != ClassType.Knight) { continue; }
                if (player.Level < 50) { continue; }

                players.Add(player);
            }

            players.Sort((lhs, rhs) => { return lhs.Level - rhs.Level; });

            return players;
        }
    }
}

 

  • 실행 결과는 아래 사진과같이 동일한것을 볼 수 있습니다.

'server > web server' 카테고리의 다른 글

[Web] 속성 바인딩  (0) 2023.02.23
[Web] List 바인딩  (0) 2023.02.23
[Web] 바인딩  (0) 2023.02.23
[Web] Blazor Server App 프로젝트 시작  (0) 2023.02.23
[C#] LINQ(Language-Integrated Query) 2  (0) 2023.02.21
bonnate