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
컴파일 타임 때 타입 체크
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
'c#' 카테고리의 다른 글
[c#][TextRpg][TeamProject] tree를 활용한 Quest 시스템 제작 (1) | 2025.02.14 |
---|---|
[c#]delegate 이해하기 (1) | 2025.02.10 |
[c#][TextRPG] 3. c#의 System.IO를 이용한 파일 시스템 작업 (0) | 2025.02.07 |
[c#][TextRPG] 2. NewtonJson으로 직렬화&역직렬화 (1) | 2025.02.06 |
[c#][TextRPG] 1. Interface를 활용한 Scene관리 / 싱글톤 (0) | 2025.02.05 |