💡 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 |
💡 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 |