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; }
}
class Program
{
static List<Player> _players = new List<Player>();
static void Main(string[] args)
{
Random random = new Random();
for (int i = 0; i < 100; i++)
{
ClassType type = ClassType.Knight;
switch (random.Next(0, 3))
{
case 0:
type = ClassType.Knight;
break;
case 1:
type = ClassType.Archer;
break;
case 2:
type = ClassType.Mage;
break;
}
Player player = new Player()
{
ClassType = type,
Level = random.Next(1, 100),
Hp = random.Next(100, 1000),
Attack = random.Next(5, 50)
};
_players.Add(player);
}
// Q) 레벨이 50 이상인 Knight만 추려내서, 레벨 낮->높 순으로 정렬
// 일반 버전
{
List<Player> players = GetHighLevelKnights();
foreach (Player p in players)
Console.WriteLine($"{p.Level} {p.Hp}");
}
// LINQ 버전
var players =
from p in _players
where p.ClassType == ClassType.Knight && p.Level >= 50
orderby p.Level
select p;
foreach (Player p in players)
Console.WriteLine($"{p.Level} {p.Hp}");
}
}
public List<Player> GetHighLevelKnights()
{
...
}
LINQ 버전이 직접 함수를 정의하여 짠 버전보다 가독성이 좋다.
_players
.Where(p => p.ClassType == ClassType.Knight && p.Level >= 50)
.OrderBy(p => p.Level)
.Select(p => p);
그리고 위 코드에서 쿼리 명령어 부분 코드는 위와 같이 메서드로 제공이 되기 때문에 MS에서 제공하는 메서드를 잘 찾아서 사용하면 된다. (https://docs.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable?view=net-6.0)
public static class Extensions
{
// IEnumerable (LINQ to Object 또는 LINQ to XML 쿼리를 만들때 사용).
// IQueryable (LINQ to SQL 쿼리) -> LINQ를 이용해서 DB에 접근할 때 최적화.
public static IQueryable<GuildDto> MapGuildToDto(this IQueryable<Guild> guild)
{
return guild.Select(g => new GuildDto()
{
Name = g.GuildName,
MemberCount = g.Members.Count
});
}
}