1. LINQ
    □ 개념
    □ 장/단점
2. 쿼리구문
3. 메서드 구문
4. 혼합된 쿼리 / 메서드 구문 
5. 직접 사용 예시

0. LINQ에 관한 다른 글

 

📝 1. LINQ 

□ Language-Integrated Query의 약자

             직역하면 "언어 통합 쿼리"

□ 관계형 데이터나 XML 데이터뿐만 아니라 모든 c# 데이터 컬렉션에 적용되는 일관된 쿼리  

 

🔖  장점

1. 데이터베이스, XML , 모든 c# 데이터 컬렉션에 동일한 쿼리 사용가능

2. 쿼리에서 사용되는 데이터 타입이 컴파일 타임에 체크됨       

             런타임에서 발생할 수 있는 오류를 줄임 

3. 데이터 처리 관련 로직을 간결하게 만들어줌

4. 데이터 필터링, 정렬, 집계, 조인 등의 작업을 간편하게 처리가능

 

🔖  단점

1. 복잡한 쿼리에서는 가독성이 떨어질 수도 있음

2. 대량의 데이터 처리 시 성능저하가 발생할 수도 있음

 

📝 2. Query Syntax ( 쿼리 구문 ) 형식

 □ from : 어느 데이터에서 가져올 것인지    

            num : 쿼리문 안에서 사용할 데이터 이름

□ where : 쿼리문에서 필터링할 조건

□ select : 조건에 만족하는 반환할 데이터 

 

예시

int[] numbers = [ 0, 1, 2, 3, 4, 5, 6 ];

// numQuery 는 IEnumerable<int> 타입
var numQuery = from num in numbers
               where (num % 2) == 0
               select num;

□ from :  int형 배열 numbers에서 가져옴

□ where : 배열 안의 값이 2로 나누어 떨어지면 (즉 짝수이면)

□ select : 값을 리턴한다

출력 [0, 2, 4, 6]

 

📝 3. Method Syntax ( 메서드 구문 ) 형식

: Sum, Max, Min, Average 등과 같은 함수를 사용한 쿼리 구문

 

예시

List<int> numbers1 = [ 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 ];
List<int> numbers2 = [ 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 ];

// 메서드 구문 1
double average = numbers1.Average();

// 메서드 구문 2
IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);

□ 메서드 구문 1

            number1라는 int 타입 리스트에서의 평균값을 구한 후 return

□ 메서드 구문 2

            numbers1 리스트와 numbers2를 합침. 

            두 배열이 합쳐진 새로운 배열을 return 

 

📝 4. 혼합된 쿼리 / 메서드 구문 

var numCount1 = (
    from num in numbers1
    where num is > 3 and < 7
    select num
).Count();

□ 쿼리구문

           ■ numbers1 리스트에서 3 초과 7 미만의 값을 고른 후 select

□ 메서드 구문 

           ■반환된 IEnumerable<int 타입의 Count를 return

 

🔖  공식 c# 홈페이지에서 추천하는 방법

IEnumerable<int> numbersQuery =
    from num in numbers1
    where num is > 3 and < 7
    select num;

var numCount2 = numbersQuery.Count();

  쿼리 구문을 사용한 후

 새 변수를 할당해서 IEnumerable<intIEnumerable <int>의 Count를 return

 

📝 5. 직접 사용 예시

내일배움캠프 c# 프로그래밍-TextRpg-팀 프로젝트 중에 사용한 코드입니다.


🔖
 람다식을 사용한 메서드 구문 1

int count = InventoryManager.instance.mountableItems
    .Count(item => item.Type == questItemType && item.Equip);

  인벤토리 매니저의 List<MountableItems> 리스트에 접근

  Linq의 메서드 구문인 Count() 사용

            조건

                       : 아이템이 type이 questItemType과 같고

                       : 착용 여부를 나타내는 Equip변수가 true인 데이터

  결과

           ■ List<Mountable> mountablesItems 리스트에 들어있는 아이템 중에

            조건에 만족하는 아이템 개수를 알 수 있음.

 

🔖 람다식을 사용한 메서드 구문 2

public class Quest
{
    private string questName;   // 퀘스트이름
    
    // 프로퍼티
    public string QuestName => questName;
    
    public Quest(string name)
    {
        this.questName = name;
    }
}
private List<Quest> quests;     // 퀘스트 컨테이너 
private string[] questName;     // 퀘스트 이름 목록

quests.Add(new Quest(name: "마을을 위협하는 미니언 처치");
quests.Add(new Quest(name: "장비를 장착해보자");
quests.Add(new Quest(name: "더욱 더 강해지기!");

// quest에서 이름만 빼서 배열로 저장 (LINQ)
questOption = quests.Select(q => q.QuestName).ToArray();

Quest 클래스 인스턴스화 한 뒤 List<Quest>에 추가 

List<Quest>에서 QuestName을 select 해서 배열로 변환

  결과

            questName[0] : 마을을 위협하는 미니언처치

            questName[1] : 장비를 장착해 보자

            questName[2] : 더욱더 강해지기 

            배열에 Quest 클래스의 제목이 차례대로 들어가게 됨

 


📝 LINQ에 관한 다른 글

추가예정  


LINQ란

https://learn.microsoft.com/ko-kr/dotnet/csharp/linq/

 

C#의 LINQ(Language-Integrated Query) - C#

C#의 LINQ(Language-Integrated Query) 소개

learn.microsoft.com

 

컴파일 타임 때 타입 체크 

https://learn.microsoft.com/ko-kr/dotnet/csharp/linq/get-started/type-relationships-in-linq-query-operations

 

LINQ 쿼리 작업의 형식 관계 - C#

LINQ 쿼리의 변수 형식이 서로 관련되는 방식에 대해 알아봅니다. LINQ 쿼리 작업은 데이터 원본, 쿼리 및 실행에서 강력하게 형식화됩니다.

learn.microsoft.com

 

쿼리 구문과 메서드 구문 

https://learn.microsoft.com/ko-kr/dotnet/csharp/linq/get-started/write-linq-queries

 

LINQ 쿼리 작성 - C#

C#에서 LINQ 쿼리를 작성하는 방법을 알아봅니다.

learn.microsoft.com

 

+ Recent posts