C# 링크

윤재학·2022년 7월 2일

C#

목록 보기
7/8

링크란?

  • LINQ ( Language Intergreated Query )는 언어에 통합된 쿼리문을 의미하는
    것으로 링크를 사용하면 컬렉션을 대상으로 데이터 베이스에 요청하는것처럼
    쿼리문을 실행하는 것이 가능하다.
    ㄴ 즉, 링크를 활용하면 데이터의 필터링 작업을 좀더 수월하게 하는것이 가능하다.

C언어 링크의 특징

  • 링크는 언어에 내장된 쿼리문이기 때문에 간단한 쿼리문 작성을 통해서 쉽게 데이터
    필터링 하는것이 가능하다.
    ㄴ 데이터의 탐색에 대한 효율성이 극대화 된다.
  • 링크는 항상 from 키워드를 통해서 시작되면 select 키워드를 통해서 최종적인
    데이터를 필터링 하는것이 가능하다.
  • 링크는 group 키워드를 통해서 특정 데이터를 2가지로 그룹화 시키는것이 가능하다.

데이터 타입 정리

from

  • 모든 쿼리식은 from으로 시작해야 한다.
    EX: from 범위 변수 in 데이터 변수

where

  • 데이터의 원본으로부터 차례대로 요소를 가져오고 그 요소가 범위 변수에
    들어가게 되면 조건식을 통해 걸러내는 역활을 한다,
    만약 요소에 대해 조건식 거짓이면 요소를 반환하지 않고 참이면 요소를 반환
  • 필터와 같은 역활이라고 생각하면 편하다. EX: where 조건식

orderby

  • 데이터의 정렬을 수행하고 오름차순 혹은 내림차순으로 정렬된 결과를
    출력하겠다.
  • 기본적으로 링크는 오름차순 정렬을 하며 "," 를 통해 둘이상의 데이터를
    한꺼번에 정렬시킬 수 있다.
  • 오름차순일 경우 ascending 키워드를 뒤에 붙이며
    내림차순일 경우 decending 키워드를 뒤에 붙인다.

select

  • 앞에 있는 모든 절과 select 절을 거쳐서 나오는 최종 결과를 뽑아낸다.
  • 기억해야 될건 LINQ 쿼리식은 from으로 시작했으면 , select 절 또는
    group 절로 끝나야만 한다.

group

  • 분류 기준에 따라 데이터를 분류하고 그룹화하여 그룹 개체를 반환한다.
  • 우리가 모양에 따라 , 색깔에 따라, 맛 등의 기준에 따라 나누듯 LINQ 쿼리식에서도
    group절을 이용하여 데이터를 분류할 수 있다.

join

  • 직접 관계가 없는 두개의 데이터 원본을 연결할때 사용한다.

EX)

struct STCharacter
    {
        public int ID;
        public int HP;
        public int Level;
        public STCharacter(int ID, int HP, int Level)
        {
            this.ID = ID;
            this.HP = HP;
            this.Level = Level;
        }
    }

struct 로 캐릭터를 만들어준다.


public void Awake()
{
 var oCharacterList = new List<STCharacter>();

        oCharacterList.Add(new STCharacter(1, 100, 10));
        oCharacterList.Add(new STCharacter(2, 200, 20));
        oCharacterList.Add(new STCharacter(3, 300, 30));
        oCharacterList.Add(new STCharacter(4, 400, 40));
        oCharacterList.Add(new STCharacter(5, 500, 50));
       
         //기본 형태
        var oResult = (from STCharacter in oCharacterList                     // 찾을 대상
                       where STCharacter.HP >= 300 || STCharacter.Level > 20 // 필터링
                       orderby STCharacter.Level ascending                    // 정렬 오름차순
                       select STCharacter).ToList();                          // 결과물

        for (int i = 0; i < oResult.Count; ++i)
        {
            var stCharacter = oResult[i];

            Debug.LogFormat("캐릭터 정보 : {0},{1},{2}", 
                stCharacter.ID, stCharacter.HP, stCharacter.Level);
        }
}


추가적으로 쿼리 작업을 수행하려면 into 키워드를 사용해야 한다.

그렇지 않을 경우에는 into 와 그룹 변수를 쓰지 않아도 된다.

        var oGroupResult = (from stCharacter in oCharacterList
                            where stCharacter.HP >= 300 || stCharacter.Level > 20
                            orderby stCharacter.Level ascending
                            group stCharacter by stCharacter.HP >= 300 into oGroup
                            select new
                            {
                                GroupKey = oGroup.Key,
                                Characters = oGroup
                            }).ToList();
                           
        for (int i = 0; i < oGroupResult.Count; ++i)
        {
            var oGroup = oGroupResult[i];
            var oCharacters = oGroup.Characters.ToList();

            for (int j = 0; j < oCharacters.Count; ++j)
            {
                var stCharacter = oCharacters[j];

                Debug.LogFormat("Key: {0}, Character: {1} ,{2} ,{3}", oGroup.GroupKey,
                    stCharacter.ID, stCharacter.HP, stCharacter.Level);
            }
        }

profile
노력하자 즐겁게 개발할수 있는 환경을 위해

0개의 댓글