티스토리 뷰

C#/C# 강좌 Winform

Doridori C# 강의) 31.Linq (링큐)

꼬꼬마도리도리 2019. 2. 22. 22:09

======================================================

안녕하세요 Doridori 입니다. 


이번 강의는 Linq(링큐)에 대한 강의 입니다. 


기초 강의로는 마지막 강의가 될것 같습니다. 


(마무리 한다기 보다는 이때까지 진행한 내용들을 정리를 하고 기능, 꿀팁 위주로 진행 할 예정입니다.)


람다식과 비슷한 느낌으로 몰라도 기능을 구현하는데는 상관없지만 알면 매우 쉽게 기능을 구현 할 수 있다고 보시면 됩니다. 


영어랑 비슷하게 계속 사용하는걸 습관 들이면 익숙하게 사용할 수 있을것 같습니다. 


화이팅!! 입니다.~!

======================================================


Linq(링큐)


Source UI) Study_31_Linq (UI).zip

Soruce 전체) Study_31_Linq.zip

교재) 31강 Linq (링큐).pdf








링큐 입니다. 


SQL이나 오라클같은 DB쪽에 Query를 보내 보셨거나 한다면 익숙한 구문일 것입니다. 


사용안해보셨다고 해서 어렵게 생각할 필요는 없는부분이 C#의 Linq의 경우 코드와 짬짜면 되서 사용되는 예약어들이 몇개 안됩니다. 


가장 처음 호출되는 form절의 경우 검색할 Data Source를 입력하게 되어 있는데 구문을 보면 foreach문과 비슷하게 생겼습니다. 

(비슷하게 생겼다는 애기는 foreach 문에서 사용되는 형태들을 대부분 사용할 수 있다고 보시면 됩니다.)


예전에 영어 공부할때 구문 변경 해보듯이 foreach 문으로 구현하던 내용을 linq로 구현 해본다던지 linq로 되어 있는 구문을 foreach문으로 바꿔본다던지 하는 형태로 연습해보면 많은 도움이 될것 같습니다. 


강의중에 select 구문에서 table 형태의 DataSource를 List형태로 바꾸는 것도 했는데 동영상 시간이 길어지다 보니 빼먹었네요 =0=;; 필요하면 추가로 넣어도 되는데 아래 ppt를 보시고 한번 해보시면 될것 같습니다. ㅎㅎ


UI)


요즘 수집류 게임이 많아서 sort 기능이 없는게임이 없는것 같은데 sort 기능을 한번 구현해 보았습니다. 


foreach문으로 구현하려고 했으면 손이 많이가는 작업인데 liq로 구현하니 매우 간결하게 구현이 되었습니다. 


시간관계상 foreach문으로 구현하지는 않았는데 한번 foreach문으로 구현 하려고 어떻게 하면 될까 생각해보시면 매우 간결해 졌구나 라고 생각해보실 수 있을것 같습니다.



강의)


요즘 회사 일도 에메하고 어수선한 시기인듯 합니다. ㅎㅎ 


자료를 준비는 해놨는데 이래저래 강의를 할 시간이 없어서 미루다가 더늦으면 2주가 지날꺼 같아서 애들이 자기 전에 강의를 만들었는데 방 밖에서 엄청 떠드네요 ㅎㅎ ;;


집중이 좀 덜된것 같기는 한데 예제가 괜찮다고 생각 합니다. ㅎㅎ 


Source를 받아서 한번 실행해 보시고 따라서 만들어 보시면 도움이 많이 될것 같습니다. 





Source)


Linq의 경우 일단 Data안에서 필요한 내용을 찾아내는 것이다 보니 일단 Data가 필요한데 너무 많이 입력하게 되면 그것역시 시간도 많이들고 해서 최소한의 Data를 가지고 자료를 만들기 위해서 자료를 만드는 공(?)을 들였습니다. ㅎ


Linq 쪽 말고 다른 부분들고 관심있게 보시면 좋을것 같습니다. 


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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace _31_Linq
{
    public partial class Form1 : Form
    {
        const string sLEVEL = "LEVEL";
        const string sNAME = "NAME";
        const string sATTRIBUTE = "ATTRIBUTE";
 
        DataTable dt;
 
        enum EnumName
        {
            슬라임,
            가고일,
            골렘,
            코볼트,
            고블린,
            고스트,
            언데드,
            노움,
            드래곤,
            웜,
            서큐버스,
            데빌,
            만티코어,
            바실리스트,
        }
 
        enum EnumAttribute
        {
            불,
            물,
            바람,
            번개,
            어둠,
            빛,
            땅,
            나무,
        }
       
        /// <summary>
        /// 진입점
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }
 
        /// <summary>
        /// Form Load Event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            DataTableCreate();  // Data Table 생성
            EnemyCreate();  // 정보 생성
            ComboBoxCreate(); // ComboBox에 Data 입력
        }
 
        /// <summary>
        /// DataTable 틀을 생성 (※23강 Data Table 생성 참조)
        /// </summary>
        private void DataTableCreate()
        {
            dt = new DataTable("Enemy");
 
            //DataColumn 생성
            DataColumn colLevel = new DataColumn(sLEVEL, typeof(int));
            DataColumn colName = new DataColumn(sNAME, typeof(string));
            DataColumn colAttribute = new DataColumn(sATTRIBUTE, typeof(string));
 
            dt.Columns.Add(colLevel);
            dt.Columns.Add(colName);
            dt.Columns.Add(colAttribute);
        }
 
        /// <summary>
        /// Data Table에 자료를 입력
        /// </summary>
        private void EnemyCreate()
        {
            Random rd = new Random();
            
            foreach (EnumName oName in Enum.GetValues(typeof(EnumName)))   // ※15강 캡슐화에서 사용
            {
                DataRow dr = dt.NewRow();
 
                dr[sLEVEL] = rd.Next(111);  // 1 ~ 10 중에서 Random
                dr[sNAME] = oName.ToString();  // 이름을 넣어 줌
 
                int iEnumLength = Enum.GetValues(typeof(EnumAttribute)).Length;  // Enum 의 개수를 가져옴
                int iAttribute = rd.Next(iEnumLength);
                dr[sATTRIBUTE] = ((EnumAttribute)iAttribute).ToString();
 
                dt.Rows.Add(dr);
            }
 
            dgEnemyTable.DataSource = dt;
        }
 
        /// <summary>
        /// Combox에 EnumAttribute를 입력
        /// </summary>
        private void ComboBoxCreate()
        {
            foreach (EnumAttribute oAttribute in Enum.GetValues(typeof(EnumAttribute)))
            {
                cboxAttribute.Items.Add(oAttribute);
            }
            cboxAttribute.SelectedIndex = 0;
        }
 
        /// <summary>
        /// Level, Name, 속성 정렬 Button Click
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSort_Click(object sender, EventArgs e)
        {
            Button oBtn = sender as Button;
 
            DataTable dtCopy = dgEnemyTable.DataSource as DataTable;   // DataGridViewe에 있는 Data를 dtCopy에 복사
 
            IEnumerable<DataRow> vSortTable = null;
 
            switch (oBtn.Name)
            {
                case "btnLevel":
                    vSortTable = from oRow in dtCopy.AsEnumerable()
                                 orderby oRow.Field<int>(sLEVEL) // 정렬 기준
                                 select oRow;
                    break;
                case "btnName":
                    vSortTable = from oRow in dtCopy.AsEnumerable()
                                 orderby oRow.Field<string>(sNAME) // 정렬 기준
                                 select oRow;
                    break;
                case "btnAttribute":
                    vSortTable = from oRow in dtCopy.AsEnumerable()
                                 orderby oRow.Field<string>(sATTRIBUTE) // 정렬 기준
                                 select oRow;
                    break;
            }
            
            dtCopy = vSortTable.CopyToDataTable();
            dgEnemyTable.DataSource = dtCopy;
        }
 
 
        /// <summary>
        /// Filter Button Click
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFilter_Click(object sender, EventArgs e)
        {
            DataTable dtCopy = dgEnemyTable.DataSource as DataTable;   // DataGridViewe에 있는 Data를 dtCopy에 복사
 
            IEnumerable<DataRow> vSortTable = from oRow in dtCopy.AsEnumerable()
                                              where oRow.Field<string>(sATTRIBUTE) == cboxAttribute.Text &&
                                              (oRow.Field<int>(sLEVEL) >= nLevelMin.Value && oRow.Field<int>(sLEVEL) <= nLevelMax.Value)
                                              select oRow;
 
            if (vSortTable.Count() > 0)
            {
                dtCopy = vSortTable.CopyToDataTable();
                dgEnemyTable.DataSource = dtCopy;
            }
            else
            {
                MessageBox.Show("검색 조건에 맞는 Data가 없습니다.");
            }
 
        }
 
 
        /// <summary>
        /// Cancel Button Click
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)
        {
            dgEnemyTable.DataSource = dt;
        }
    }
}
 
cs



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함