Language Integrated Query의 줄임말로, C# 내부에 내장된 쿼리(Query) 언어입니다.
List, Array, Dictionary, IEnumerable<T> 등에 매우 유용하게 사용됩니다.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; }
}
Random rand = new Random();
List<Player> _players = new List<Player>();
for (int i = 0; i < 100; i++)
{
ClassType type = (ClassType)rand.Next(0, 3);
Player player = new Player()
{
ClassType = type,
Level = rand.Next(1, 100),
Hp = rand.Next(100, 1000),
Attack = rand.Next(10, 100)
};
_players.Add(player);
}
public static List<Player> GetHighLevelKnights()
{
List<Player> result = new List<Player>();
foreach (Player p in _players)
{
if (p.ClassType == ClassType.Knight && p.Level >= 50)
result.Add(p);
}
result.Sort((lhs, rhs) => lhs.Level.CompareTo(rhs.Level));
return result;
}
var players =
from p in _players
where p.ClassType == ClassType.Knight && p.Level >= 50
orderby p.Level
select p;
from p in _players: foreach (Player p in _players)where: 조건 필터 (Knight, Level >= 50)orderby: 정렬 기준 (Level 오름차순)select: 최종 반환할 데이터 지정📌 장점: 코드가 짧고, 가독성이 뛰어나며 SQL과 유사한 형식이므로 익숙하다면 배우기 쉽습니다.
| 구성 요소 | 설명 |
|---|---|
from | 데이터 소스 순회 (foreach 역할) |
where | 조건 필터링 |
orderby | 정렬 (기본은 ascending) |
select | 결과 추출 (필드 지정도 가능) |
var players =
from p in _players
where p.ClassType == ClassType.Knight && p.Level >= 50
orderby p.Level
select new { Hp = p.Hp, Level = p.Level * 2 };
select new {}: 익명 타입으로 새로운 가공된 데이터를 반환Level * 2: 연산 처리도 가능public class Player
{
public List<int> Items { get; set; } = new List<int>();
}
// 중첩 from
var playerItems =
from p in _players
from item in p.Items
where item < 30
select new { p, item };
foreach를 LINQ로 표현from p, from item in p.Items: 2중 루프와 동일var playersByLevel =
from p in _players
group p by p.Level into g
orderby g.Key
select g;
group by: 특정 필드를 기준으로 그룹화g.Key: 그룹 기준 (여기서는 Level)g: 해당 그룹에 속한 플레이어 집합List<int> levels = new List<int> { 1, 5, 10 };
var playerLevels =
from p in _players
join l in levels on p.Level equals l
select p;
join l in levels on p.Level equals l: p.Level과 l이 일치하면 조인INNER JOIN과 동일한 방식var players2 = _players
.Where(p => p.ClassType == ClassType.Knight && p.Level >= 50)
.OrderBy(p => p.Level)
.Select(p => p);
Where(), OrderBy(), Select() 등 메서드 체이닝📌 대부분의 LINQ 연산은 이 방식으로도 동일하게 구현 가능
LINQ 표준 연산자 문서 (MS 공식 문서):
https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable