카테고리 없음

[C#] 컬렉션, delegate, LINQ, property .기본 코드

vhxpffltm 2020. 3. 19. 22:14
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3
{
   
    delegate int fun(int a, int b);
    delegate T fun2<T>(T a, T b);
    delegate void fun3();// delegate chain 용
    delegate int Mydelegate(int aa, int bb);
    delegate void Mydelegate2(int A, int B);
    class Program
    {
        
        public static int SUM(int a,int b) { return a + b; }
        public static int SUB(int a, int b) { return a - b; }
        public static int MUL(int a, int b) { return a * b; }
        public static float MUL2(float a, float b) { return a * b; }
        public static void SHOW(int a,int b, fun dele) { Console.WriteLine("CALL BACK METHOD...?? " + dele(a, b)); }
        public static void SHOW2<T>(T a, T b , fun2<T> dele) { Console.WriteLine("CALL BACK Generalization method....??: " + dele(a, b)); }
        public static void F1() { Console.Write("Chain First...."); }
        public static void F2() { Console.Write("Chain Second...."); }
        public static void F3() { Console.Write("Chain Third...."); }
        // static 선언으로 바로 참조하도록 함
 
        static void Main(string[] args)
        {
            
            Console.WriteLine("-------------------property-------------------------------");
            Property go = new Property { dir = 11, name = "????" };
            go.number = 100;
            go.num2 = 1;
            go.dir2 = 2;
            go.show(go.number);
            go.show(go.num2);
            go.show(go.sum);
            //이젠 클래스 파일을 이용해서 할것 -property: set,get- 
 
 
            Console.WriteLine("-------------------일반화-------------------------------");
            generalization g = new generalization();
            g.print<int>(g.age);
            g.print<float>(g.h);
            g.print<string>(g.name);
            test<int> list1 = new test<int>();
            list1.arr[0= 10;
            list1.print(list1.arr[0]);
            test<float> list2 = new test<float>();
            list2.arr[0= 2.24f;
            list2.print(list2.arr[0]);
            test2<generalization> list = new test2<generalization>();
            list.array[0= new generalization();
            Console.WriteLine(list.array[0].name2);
          
            //일반화 컬렉션(메서드, 클래스) : <> 을 사용하여 타입을 추론
 
 
            Console.WriteLine("-------------------델리게이트 기본-------------------------------");
            fun cal;
            cal = new fun(SUM); // 델리게이트 변수 선언
            int sum = cal(100012);
            Console.WriteLine("10001 + 2 = {0}.....", sum);
            cal = new fun(SUB);
            Console.WriteLine("100001 - 1 = {0}.....",cal(1000001,1));
            //델리게이트 - programs 클래스 바로 아래에 : 특정 메서드를 대신 호출하는 방법
 
            Console.WriteLine("-------------------델리게이트 콜벡 메서드-------------------------------");
            fun plus = new fun(SUM); // 변수 plus를 함수처럼 : 자바스크립트 생각
            fun minus = new fun(SUB);
            fun multi = new fun(MUL);
            fun2<float> mul = new fun2<float>(MUL2);
            SHOW(111111, plus);
            SHOW(10090, minus);
            SHOW(1010, multi); // 파라미터에 함수를 넣었다.
            SHOW2(13.4f, 25.3f, mul);
            //콜벡 메서드를 구현할때 자주 사용 -> A메서드 호출 시, B메서드를 넘겨 A메서드에서 B를 호출하는것 -> 이때 A를 콜백메서드라함
 
            Console.WriteLine("-------------------델리게이트 체인-------------------------------");
            fun3 chain = new fun3(F1);
            chain = chain + F2;
            chain = chain + F3;
            chain(); // 출력 -> chain은 함수F1으로 처음에 생성했음
            Console.WriteLine();
            chain = chain - F1;
            chain();
            Console.WriteLine();
            //델리게이트 체인: 하나의 델리게이트에서 여러개의 메서드를 연결
 
            Console.WriteLine("-------------------델리게이트 이벤트-------------------------------");
            myevent manager = new myevent();
            manager.eventcall += new Mydel(EventNUm); //이벤트 변수를 통해 델리게이트 생성
            for (int i = 1; i < 10; i++manager.check(i); // 생성한 델리게이트로 접근
            //이벤트: 델리게이트 타입을 선언하면서 이벤트 변수를 생성가능, event 한정자로
            //메서드를 참조하는데 private같은 느낌, 외부에서 호출 불가능, 변수가 속한 클래스 내부에서만 사용가능
 
            Console.WriteLine("-------------------람다식-------------------------------");
            Mydelegate add123 = (aa, bb) => aa + bb; // 람다식에서 ()안에 이미 선언된거 사용하지 말기
            Console.WriteLine("Lamda...... : " + add123(1020));
            Mydelegate2 F = (A, B) =>
            {
                if (A > B) Console.WriteLine("A is bigger than B");
                else if (A < B) Console.WriteLine("B is biiger than A");
                else Console.WriteLine("SAME.......");
            };
            F(200300);
            //무명 메서드를 계산식으로 표현: 자바스크립트의 => 와 비슷
 
            Console.WriteLine("-------------------Fun/Action 델리게이트-------------------------");
            Func<float> ff0 = () => 0.383f;
            Func<intfloat> ff1 = (a) => a * 0.3837f;
            Func<intintfloat> ff2 = (aa, bb) => (aa + bb) * 29.382f;
            Func<intintintfloat> ff3;
            ff3 = new Func<intintintfloat>(temp);
            Console.WriteLine("ff0 : " + ff0());
            Console.WriteLine("ff1 : " + ff1(10));
            Console.WriteLine("ff2 : " + ff2(12));
            Console.WriteLine("ff3 : " + ff3(123)); // 간결한 코드 작성 가능
            //<,>에서 마지막은 반환형, 앞의것은 매개변수
 
            int mount = 0;
            Action act1 = () => Console.WriteLine("name : Action0");
            Action<string> act2 = new Action<string>(temp2);
            Action<stringstring> act3 = (name, age) =>
             {
                 Console.WriteLine("act3 -> nmae : " + name);
                 Console.WriteLine("act3 -> age : " + age);
             };
            Action<intintint> act4 = (aa, bb, cc) => mount = aa + bb + cc;
            act1();
            act2("엑트 2");
            act3("엑트 3""29");
            act4(123); //temp2의 함수의 반환형이 void임에 주의
            //미리 선언된 델리게이트 변수로 func는 반환값이 있는 메서드를 참조하는 델리게이트 변수
            //action은 반환값이 없는 메서드를 참조하는 델리게이트 변수
 
            Console.WriteLine("-------------------LINQ (링크)-------------------------");
            Woman[] womanlist =
            {
                new Woman() {name = "Kim",age=10 },
                new Woman() {name = "park", age = 20 },
                new Woman() {name = "Lee", age = 30 },
                new Woman() {name = "HUR",age = 40 },
            };
 
            var linq = from Woman in womanlist //배열이나 컬렉션 타입을 사용해야함
                       where Woman.age >= 21
                       orderby Woman.age ascending
                       //select Woman.name; //string형 name 데이터 추출 
                       select new //무명 타입의 배열데이터 추출
                       {
                           title = "Adult Woman",
                           name = Woman.name
                       };
 
            foreach(var Woman in linq)
            {
                Console.WriteLine("{0} : {1} "Woman.title,Woman.name);
            }
            //데이터에 대해 질문하는 언어? 쿼리식과 비슷
            //from : 데이터를 검색할 범위를 지정
            //where: 필터 역할, 조건탐색
            //orderby: 정렬, 기본값은 오름차순
            //select: 검색된 데이터 추출
        }
        static void temp2(string s) { Console.WriteLine("act2 -> name :" + s); }
 
        static float temp(int a,int b,int c) { return (a + b + c) * 1.11f; }
 
        static void EventNUm(int a)
        {
            Console.WriteLine("{0}는 짝수입니다...", a);
        }
 
        static int add(params int[] arr)
        {
            int s = 0;
            for(int i = 0; i < arr.Length; i++)
            {
                s = s + arr[i];
            }
            return s;
        }
 
        static string NULL(string value, int len)
        {
            return value?.Substring(0Math.Min(value.Length, len));
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

 

Class : property

 

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3
{
    class Property
    {
        private int num;
        public int number
        {
            set { num = value; } // value는 예약된 변수로 맴버변수에 대입하는 값이 자동으로 들어감
            get { return num; }
        }
 
        public int num2 { set; get; }   //자동 구현 프로퍼티, set을 빼고 get만 넣어주면 맴버변수를 읽기만 함
        
        public int dir { set; get; }
        public int dir2 { set; get; }
        public string name { set; get; }
        public int sum { get { return dir + dir2; } }
 
 
        public void show(int n)
        {
            Console.WriteLine("Property value..... : " + n); 
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

Class : generaliztion

 

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3
{
    class generalization
    {
        public int age = 28;
        public float h = 1.12234f;
        public string name = "HUR";
        public string name2 { set; get; }
        public generalization() { name2 = "where.....?"; }
        public generalization(string s) { name2 = s; }
        public void print<T>(T value) //T에 원하는 타입을 지정하면 print메서드 내부의 T가 전부 지정한 변수로 치환
        {
            Console.WriteLine("generalzation value....: " + value);
        }
    }
 
    class test<T>
    {
        public T[] arr;
        public test() { arr = new T[1]; }
        public void print(T n) { Console.WriteLine("Class generaliztion...." + n); }
    }
    class test2<T> where T : generalization
    {
        public T[] array;
        public test2() { array = new T[2]; }
        //public void print(T n) { Console.WriteLine("Class where gernraliztion...." + n); }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

Class: myevent

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3
{
    delegate void Mydel(int a);
    class myevent
    {
        public event Mydel eventcall; //event 변수를 생성
        public void check(int a)
        {
            if (a % 2 == 0) eventcall(a);
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

Class: LINQ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3
{
    class LINQ
    {
 
    }
    class Woman
    {
        public string name { get; set; }
        public int age { get; set; }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

Refernce

 

https://mrw0119.tistory.com/

https://blog.hexabrain.net/