Home [고급 C#] LINQ #2
Post
Cancel

[고급 C#] LINQ #2

LINQ 문법 정리

기본적인 문법(from, where, orderby, select)

from 어떤 데이터에서 찾을 것인지
where 어떤 조건으로 찾을 것인지
orderby 어떤 항목을 기준으로 정렬할 것인지
select 어떤 항목을 추출할 것인지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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; }
    public List<int> Items { get; set; } = new List<int>();
}

class Program
{
    static List<Player> _players = new List<Player>();

    static void Main(String[] args)
    {
        Random rand = new Random();

        // player 데이터 100개 랜덤 생성
        for (int i = 0; i < 100; i++)
        {
            ClassType type = ClassType.Knight;
            switch (rand.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 = rand.Next(1, 10),
                Hp = rand.Next(100, 1000),
                Attack = rand.Next(5, 50)
            };

            for (int j = 0; j < 5; j++)
                player.Items.Add(rand.Next(1, 101));

            _players.Add(player);
        }

        //LINQ 사용
        // 레벨이 50 이상인 Knight만 추려내서, 레벨 오름차순으로 정렬
        var players =
            from p in _players
            where p.classType == ClassType.Knight && p.Level >= 50
            orderby p.Level ascending
            select p;

        foreach (Player p in players)
        {
            Console.WriteLine($"{p.Level} {p.Hp}");
        }
    }
}

중첩 from

이중 foreach문과 유사하다.

1
2
3
4
5
6
7
8
// 아이템id가 30미만인 모든 아이템 목록을 추출
var playerItems =
    from p in _players
    from i in p.Items
    where i < 30
    select new { p, i };

var li = playerItems.ToList();

LINQ 중첩 from LINQ 중첩 from

grouping

데이터들을 그룹화하여 추출이 가능하다.

1
2
3
4
5
6
// 레벨별로 그룹화하여 추출
var playersByLevel =
    from p in _players
    group p by p.Level into g
    orderby g.Key
    select new { g.Key, Players = g };

LINQ grouping LINQ grouping

join

두 데이터 리스트들을 join하여 추출이 가능하다.

1
2
3
4
5
6
7
8
// 레벨이 1, 5, 9인 player 데이터만 추출
List<int> levels = new List<int>() { 1, 5, 9 };

var playerLevels =
    from p in _players
    join l in levels
    on p.Level equals l
    select p;

LINQ join LINQ join

LINQ 표준 연산자

LINQ는 SQL과 비슷한 문법으로 사용할 수 있게 되어 있지만 다른 문법으로도 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
var players =
    from p in _players
    where p.classType == ClassType.Knight && p.Level >= 50
    orderby p.Level ascending
    select p;

var players2 = _players
    .Where(p => p.classType == ClassType.Knight && p.Level >= 50)
    .OrderBy(p => p.Level)
    .Select(p => p);

위 코드에서의 두 문법은 똑같이 동작한다.
우리가 SQL과 비슷한 문법으로 작성하더라도 실질적으로는 위와 같이 메소드 형태로 동작한다.
둘 다 알아놓는 것이 좋고 이외 많은 기능들이 있지만 필요할 때마다 찾아 사용하면 된다.

This post is licensed under CC BY 4.0 by the author.