c# 기초구문 업데이트 완료
This commit is contained in:
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
Console.WriteLine("Hello, World!");
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
internal class Program
|
internal class Program
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 클래스나 함수에 대한 코멘트
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="args"></param>
|
||||||
private static void Main(string[] args)
|
private static void Main(string[] args)
|
||||||
{
|
{
|
||||||
// 코멘트: 한 라인 코멘트는 두개의 슬래시 사용함
|
// 코멘트: 한 라인 코멘트는 두개의 슬래시 사용함
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
class MyClass
|
||||||
|
{
|
||||||
|
// 1. delegate 선언
|
||||||
|
private delegate void RunDelegate(int i);
|
||||||
|
|
||||||
|
private void RunThis(int val)
|
||||||
|
{
|
||||||
|
// 콘솔출력 : 1024
|
||||||
|
Console.WriteLine("{0}", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunThat(int value)
|
||||||
|
{
|
||||||
|
// 콘솔출력 : 0x400
|
||||||
|
Console.WriteLine("0x{0:X}", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Perform()
|
||||||
|
{
|
||||||
|
// 2. delegate 인스턴스 생성
|
||||||
|
RunDelegate run = new RunDelegate(RunThis);
|
||||||
|
// 3. delegate 실행
|
||||||
|
run(1024);
|
||||||
|
|
||||||
|
//run = new RunDelegate(RunThat); 을 줄여서
|
||||||
|
//아래와 같이 쓸 수 있다.
|
||||||
|
run = RunThat;
|
||||||
|
|
||||||
|
run(1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PerformMultiCast(int val)
|
||||||
|
{
|
||||||
|
RunDelegate run = RunThis;
|
||||||
|
run += RunThat;
|
||||||
|
run(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MySort
|
||||||
|
{
|
||||||
|
// 델리게이트 CompareDelegate 선언
|
||||||
|
public delegate int CompareDelegate(int i1, int i2);
|
||||||
|
|
||||||
|
public static void Sort(int[] arr, CompareDelegate comp)
|
||||||
|
{
|
||||||
|
if (arr.Length < 2) return;
|
||||||
|
Console.WriteLine("함수 Prototype: " + comp.Method);
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
for (int i = 0; i < arr.Length - 1; i++)
|
||||||
|
{
|
||||||
|
for (int j = i + 1; j < arr.Length; j++)
|
||||||
|
{
|
||||||
|
ret = comp(arr[i], arr[j]);
|
||||||
|
if (ret == -1)
|
||||||
|
{
|
||||||
|
// 교환
|
||||||
|
int tmp = arr[j];
|
||||||
|
arr[j] = arr[i];
|
||||||
|
arr[i] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Display(arr);
|
||||||
|
}
|
||||||
|
static void Display(int[] arr)
|
||||||
|
{
|
||||||
|
foreach (var i in arr) Console.Write(i + " ");
|
||||||
|
Console.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
MyClass mc = new MyClass();
|
||||||
|
mc.Perform();
|
||||||
|
|
||||||
|
(new Program()).Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Run()
|
||||||
|
{
|
||||||
|
int[] a = { 5, 53, 3, 7, 1 };
|
||||||
|
|
||||||
|
// 올림차순으로 소트
|
||||||
|
MySort.CompareDelegate compDelegate = AscendingCompare;
|
||||||
|
MySort.Sort(a, compDelegate);
|
||||||
|
|
||||||
|
// 내림차순으로 소트
|
||||||
|
compDelegate = DescendingCompare;
|
||||||
|
MySort.Sort(a, compDelegate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompareDelegate 델리게이트와 동일한 Prototype
|
||||||
|
int AscendingCompare(int i1, int i2)
|
||||||
|
{
|
||||||
|
if (i1 == i2) return 0;
|
||||||
|
return (i2 - i1) > 0 ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompareDelegate 델리게이트와 동일한 Prototype
|
||||||
|
int DescendingCompare(int i1, int i2)
|
||||||
|
{
|
||||||
|
if (i1 == i2) return 0;
|
||||||
|
return (i1 - i2) > 0 ? 1 : -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
using static MyClass;
|
||||||
|
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
MyClass cls = new();
|
||||||
|
cls.OnFinished += new OnFinishedEventHandler(Cls_OnFinished);
|
||||||
|
cls.OnFinished += Cls_OnFinished;
|
||||||
|
|
||||||
|
//Annonymous Method 사용
|
||||||
|
cls.OnFinished2 += delegate (object? sender, EventArgs eventArgs)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Finished");
|
||||||
|
};
|
||||||
|
|
||||||
|
//Lambda 식 사용, 무명메서드를 대신할 수 있다.
|
||||||
|
//(입력 파라미터) => { 실행문장 블럭 };
|
||||||
|
cls.OnFinished += (sender, eventArgs) => { Console.WriteLine("Finished"); };
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Cls_OnFinished(object? sender, EventArgs eventArgs)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Finished");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyClass
|
||||||
|
{
|
||||||
|
//EventHandler를 delegate로 구현
|
||||||
|
public delegate void OnFinishedEventHandler(object? sender, EventArgs eventArgs);
|
||||||
|
public event OnFinishedEventHandler? OnFinished;
|
||||||
|
|
||||||
|
public EventHandler<EventArgs>? OnFinished2;
|
||||||
|
|
||||||
|
public void Run(int complexity)
|
||||||
|
{
|
||||||
|
Thread.Sleep(complexity);
|
||||||
|
OnFinished?.Invoke(this, EventArgs.Empty);
|
||||||
|
OnFinished2?.Invoke(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var t = new { Name = "홍길동", Age = 20 };
|
||||||
|
string s = t.Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunTest()
|
||||||
|
{
|
||||||
|
var v = new[] {
|
||||||
|
new { Name="Lee", Age=33, Phone="02-111-1111" },
|
||||||
|
new { Name="Kim", Age=25, Phone="02-222-2222" },
|
||||||
|
new { Name="Park", Age=37, Phone="02-333-3333" },
|
||||||
|
};
|
||||||
|
|
||||||
|
// LINQ Select를 이용해 Name과 Age만 갖는 새 익명타입 객체들을 리턴.
|
||||||
|
var list = v.Where(p => p.Age >= 30).Select(p => new { p.Name, p.Age });
|
||||||
|
foreach (var a in list)
|
||||||
|
{
|
||||||
|
Debug.WriteLine(a.Name + a.Age);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private (string name, int age) Test()
|
||||||
|
{
|
||||||
|
return ("Stive", 45);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using System.Text;
|
||||||
|
|
||||||
|
public static class ExClass
|
||||||
|
{
|
||||||
|
// static 확장메서드를 정의. 첫번째 파라미터는
|
||||||
|
// 어떤 클래스가 사용할 지만 지정.
|
||||||
|
public static string ToChangeCase(this String str)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
foreach (var ch in str)
|
||||||
|
{
|
||||||
|
if (ch >= 'A' && ch <= 'Z')
|
||||||
|
sb.Append((char)('a' + ch - 'A'));
|
||||||
|
else if (ch >= 'a' && ch <= 'z')
|
||||||
|
sb.Append((char)('A' + ch - 'a'));
|
||||||
|
else
|
||||||
|
sb.Append(ch);
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 이 확장메서드는 파라미터 ch가 필요함
|
||||||
|
public static bool Found(this String str, char ch)
|
||||||
|
{
|
||||||
|
int position = str.IndexOf(ch);
|
||||||
|
return position >= 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
string s = "This is a Test";
|
||||||
|
|
||||||
|
// s객체 즉 String객체가
|
||||||
|
// 확장메서드의 첫 파리미터임
|
||||||
|
// 실제 ToChangeCase() 메서드는
|
||||||
|
// 파라미터를 갖지 않는다.
|
||||||
|
string s2 = s.ToChangeCase();
|
||||||
|
|
||||||
|
// String 객체가 사용하는 확장메서드이며
|
||||||
|
// z 값을 파라미터로 사용
|
||||||
|
bool found = s.Found('z');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
// 1. dynamic은 중간에 형을 변환할 수 있다.
|
||||||
|
|
||||||
|
dynamic v = 1;
|
||||||
|
// System.Int32 출력
|
||||||
|
Console.WriteLine(v.GetType());
|
||||||
|
|
||||||
|
v = "abc";
|
||||||
|
// System.String 출력
|
||||||
|
Console.WriteLine(v.GetType());
|
||||||
|
|
||||||
|
|
||||||
|
// 2. dynamic은 cast가 필요없다
|
||||||
|
|
||||||
|
object o = 10;
|
||||||
|
// 틀린표현
|
||||||
|
// (에러: Operator '+' cannot be applied to operands of type 'object' and 'int')
|
||||||
|
//o = o + 20;
|
||||||
|
|
||||||
|
// 맞는 표현: object 타입은 casting이 필요하다
|
||||||
|
o = (int)o + 20;
|
||||||
|
|
||||||
|
// dynamic 타입은 casting이 필요없다.
|
||||||
|
dynamic d = 10;
|
||||||
|
d = d + 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 동일 어셈블리에서 익명타입에 dynamic 사용한 경우
|
||||||
|
class Class1
|
||||||
|
{
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
dynamic t = new { Name = "Kim", Age = 25 };
|
||||||
|
|
||||||
|
var c = new Class2();
|
||||||
|
c.Run(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Class2
|
||||||
|
{
|
||||||
|
public void Run(dynamic o)
|
||||||
|
{
|
||||||
|
// dynamic 타입의 속성 직접 사용
|
||||||
|
Console.WriteLine(o.Name);
|
||||||
|
Console.WriteLine(o.Age);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var cls = new Class1();
|
||||||
|
cls.Run();
|
||||||
|
cls.Get();
|
||||||
|
cls.Put();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. Partial Class - 3개로 분리한 경우
|
||||||
|
partial class Class1
|
||||||
|
{
|
||||||
|
public void Run() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
partial class Class1
|
||||||
|
{
|
||||||
|
public void Get() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
partial class Class1
|
||||||
|
{
|
||||||
|
public void Put() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Partial Struct
|
||||||
|
partial struct Struct1
|
||||||
|
{
|
||||||
|
public int ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
partial struct Struct1
|
||||||
|
{
|
||||||
|
public string Name;
|
||||||
|
|
||||||
|
public Struct1(int id, string name)
|
||||||
|
{
|
||||||
|
this.ID = id;
|
||||||
|
this.Name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Partial Interface
|
||||||
|
partial interface IDoable
|
||||||
|
{
|
||||||
|
string Name { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
partial interface IDoable
|
||||||
|
{
|
||||||
|
void Do();
|
||||||
|
}
|
||||||
|
|
||||||
|
// IDoable 인터페이스를 구현
|
||||||
|
public class DoClass : IDoable
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
public void Do()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Hello, World!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AClass
|
||||||
|
{
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
// Action<T>
|
||||||
|
// 입력 : T 타입
|
||||||
|
// 리턴갑 : 없음
|
||||||
|
|
||||||
|
// 기존 메서드 지정
|
||||||
|
System.Action<string> act = Output;
|
||||||
|
act("Hello");
|
||||||
|
|
||||||
|
// 무명 메서드 지정
|
||||||
|
Action<string, string> act2 = delegate (string msg, string title)
|
||||||
|
{
|
||||||
|
Console.WriteLine(msg, title);
|
||||||
|
};
|
||||||
|
act2("No data found", "Error");
|
||||||
|
|
||||||
|
// 람다식 사용
|
||||||
|
Action<int> act3 = code => Console.WriteLine("Code: {0}", code);
|
||||||
|
act3(1033);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Output(string s)
|
||||||
|
{
|
||||||
|
Console.WriteLine(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BClass
|
||||||
|
{
|
||||||
|
int _state;
|
||||||
|
//---------------------
|
||||||
|
// 예제 1
|
||||||
|
// Func<TResult>
|
||||||
|
// 입력: 없음
|
||||||
|
// 리턴: TResult 타입
|
||||||
|
//---------------------
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
// 메서드 지정
|
||||||
|
System.Func<bool> f = IsValid;
|
||||||
|
bool result = f();
|
||||||
|
|
||||||
|
// 무명 메서드 지정
|
||||||
|
Func<bool> fa = delegate
|
||||||
|
{
|
||||||
|
return _state == 0;
|
||||||
|
};
|
||||||
|
result = fa();
|
||||||
|
|
||||||
|
// 람다식 이용
|
||||||
|
Func<bool> fb = () => _state == 0;
|
||||||
|
result = fb();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
return _state == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
// 예제 2
|
||||||
|
// Func<T1, TResult>
|
||||||
|
// 입력: 1개
|
||||||
|
// 리턴: TResult 타입
|
||||||
|
//---------------------
|
||||||
|
public void Run1()
|
||||||
|
{
|
||||||
|
// 메서드 지정
|
||||||
|
System.Func<int, bool> f = IsValidRange;
|
||||||
|
bool result = f(10);
|
||||||
|
|
||||||
|
// 무명 메서드 지정
|
||||||
|
Func<int, bool> fa = delegate (int n)
|
||||||
|
{
|
||||||
|
return n > 0;
|
||||||
|
};
|
||||||
|
result = fa(-1);
|
||||||
|
|
||||||
|
// 람다식 이용
|
||||||
|
Func<int, bool> fb = n => n > 0;
|
||||||
|
result = fb(-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValidRange(int n)
|
||||||
|
{
|
||||||
|
return n > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Predicate()
|
||||||
|
{
|
||||||
|
// Predicate<T>
|
||||||
|
Predicate<int> p = delegate (int n)
|
||||||
|
{
|
||||||
|
return n >= 0;
|
||||||
|
};
|
||||||
|
bool res = p(-1);
|
||||||
|
|
||||||
|
Predicate<string> p2 = s => s.StartsWith("A");
|
||||||
|
res = p2("Apple");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UsePredicate()
|
||||||
|
{
|
||||||
|
int[] arr = { -10, 20, -30, 4, -5 };
|
||||||
|
|
||||||
|
// Predicate의 사용
|
||||||
|
// Array.Find(int[], Predicate<int>)
|
||||||
|
int pos = Array.Find(arr, IsPositive);
|
||||||
|
|
||||||
|
// LINQ에서 Func의 사용
|
||||||
|
// Where(Func<int, bool> predicate)
|
||||||
|
var v = arr.Where(n => n >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsPositive(int i)
|
||||||
|
{
|
||||||
|
return i >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var db = new DataBase { DBName = "mydb"};
|
||||||
|
|
||||||
|
// 쿼리식 표현
|
||||||
|
var v = from ord in db.Orders
|
||||||
|
where ord.Customer_ID == "FRANS"
|
||||||
|
orderby ord.Order_Date ascending
|
||||||
|
select ord;
|
||||||
|
|
||||||
|
// 메서드식 표현1
|
||||||
|
var w = db.Orders.Where(order => order.Customer_ID == "FRANS").Select(o => o);
|
||||||
|
|
||||||
|
// 메서드식 표현2
|
||||||
|
// 위의 메서드식 표현1의 Select()메서드는 동일데이타를
|
||||||
|
// 변형없이 리턴하므로 생략가능
|
||||||
|
var x = db.Orders.Where(order => order.Customer_ID == "FRANS");
|
||||||
|
|
||||||
|
x.Select((item, index) => new { IDX = index, ITEM = item });
|
||||||
|
|
||||||
|
//기타 확장메서드
|
||||||
|
x.First();
|
||||||
|
x.FirstOrDefault();
|
||||||
|
x.Last();
|
||||||
|
var l = x.ToList();
|
||||||
|
l.ForEach(item => Console.WriteLine(item.Customer_ID));
|
||||||
|
x.Select(item => item.Order_Date).Distinct();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DataBase
|
||||||
|
{
|
||||||
|
public string DBName = string.Empty;
|
||||||
|
public List<Order> Orders = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
class Order
|
||||||
|
{
|
||||||
|
public string Customer_ID = string.Empty;
|
||||||
|
public DateTime Order_Date;
|
||||||
|
public List<string> Items = new();
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
//비동기 Task 코드가 실행되는 메서드는 async 접두사 및 리턴형이 Task 이어야 함.
|
||||||
|
private static async Task Main(string[] args)
|
||||||
|
{
|
||||||
|
var cls = new AClass();
|
||||||
|
cls.ComplexCalc(3000); // 동기처리
|
||||||
|
cls.ComplexCalc(2000); // 동기처리
|
||||||
|
|
||||||
|
await cls.ComplexCalcAsync(3000); // 비동기 처리
|
||||||
|
|
||||||
|
|
||||||
|
var task1 = Task<int>.Run(() => cls.ComplexCalc(3000));
|
||||||
|
var task2 = Task<int>.Run(() => cls.ComplexCalc(2000));
|
||||||
|
Task<int>[] tasks = { task1, task2 };
|
||||||
|
|
||||||
|
//먼저완료되는 타스크를 먼저처리
|
||||||
|
var anytask = Task.WhenAny(tasks);
|
||||||
|
Task<int> finTask = await anytask;
|
||||||
|
var result = await finTask;
|
||||||
|
|
||||||
|
//모두가 완료되기를 기다리는 타스크.
|
||||||
|
Task alltask = Task.WhenAll(tasks);
|
||||||
|
await alltask;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AClass
|
||||||
|
{
|
||||||
|
|
||||||
|
public int ComplexCalc(int complexity)
|
||||||
|
{
|
||||||
|
Thread.Sleep(complexity);
|
||||||
|
return complexity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<int> ComplexCalcAsync(int complexity)
|
||||||
|
{
|
||||||
|
var task = Task.Run(() => ComplexCalc(complexity));
|
||||||
|
// await 가 나오기 전까지 다른 동시작업 가능
|
||||||
|
|
||||||
|
var result = await task;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -55,6 +55,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExP.Interface", "ExP.Interf
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExQ.Delegate1", "ExQ.Delegate1\ExQ.Delegate1.csproj", "{52E7A86E-720F-4111-AA1B-8C5FADE7E207}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExQ.Delegate1", "ExQ.Delegate1\ExQ.Delegate1.csproj", "{52E7A86E-720F-4111-AA1B-8C5FADE7E207}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ex0.HelloWorld", "Ex0.HelloWorld\Ex0.HelloWorld.csproj", "{743A8755-9C77-4BCE-AA6B-F1DF00F036C3}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExR.Delegate2", "ExR.Delegate2\ExR.Delegate2.csproj", "{100ACD41-9CAA-4D35-9FAB-D69454108765}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExS.Delegate3", "ExS.Delegate3\ExS.Delegate3.csproj", "{4F17039D-2412-44C3-B9CA-353F334214CC}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExT.AnonymousType", "ExT.AnonymousType\ExT.AnonymousType.csproj", "{228B0751-AE25-4A7E-B26C-4A71D3B48DB7}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExU.ExtensionMethod", "ExU.ExtensionMethod\ExU.ExtensionMethod.csproj", "{16ED9B03-680A-4707-A5D8-13A9A0FF0323}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExV.DynamicType", "ExV.DynamicType\ExV.DynamicType.csproj", "{22B1AA8B-7648-4035-9977-4CD68E577FFF}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExW.PartialClass", "ExW.PartialClass\ExW.PartialClass.csproj", "{2D90677D-CB86-4DE5-912B-667157E8D848}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExX.ActionFunc", "ExX.ActionFunc\ExX.ActionFunc.csproj", "{2F93CBEC-DA70-4A02-B694-910CB5D2FDBA}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExY.Linq", "ExY.Linq\ExY.Linq.csproj", "{AFE0112F-E5CA-4EAE-A4FF-F41352E448F8}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExZ.Task", "ExZ.Task\ExZ.Task.csproj", "{9755E0CD-EA75-4006-8657-08B0A465C884}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -165,6 +185,46 @@ Global
|
|||||||
{52E7A86E-720F-4111-AA1B-8C5FADE7E207}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{52E7A86E-720F-4111-AA1B-8C5FADE7E207}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{52E7A86E-720F-4111-AA1B-8C5FADE7E207}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{52E7A86E-720F-4111-AA1B-8C5FADE7E207}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{52E7A86E-720F-4111-AA1B-8C5FADE7E207}.Release|Any CPU.Build.0 = Release|Any CPU
|
{52E7A86E-720F-4111-AA1B-8C5FADE7E207}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{743A8755-9C77-4BCE-AA6B-F1DF00F036C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{743A8755-9C77-4BCE-AA6B-F1DF00F036C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{743A8755-9C77-4BCE-AA6B-F1DF00F036C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{743A8755-9C77-4BCE-AA6B-F1DF00F036C3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{100ACD41-9CAA-4D35-9FAB-D69454108765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{100ACD41-9CAA-4D35-9FAB-D69454108765}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{100ACD41-9CAA-4D35-9FAB-D69454108765}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{100ACD41-9CAA-4D35-9FAB-D69454108765}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{4F17039D-2412-44C3-B9CA-353F334214CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{4F17039D-2412-44C3-B9CA-353F334214CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{4F17039D-2412-44C3-B9CA-353F334214CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{4F17039D-2412-44C3-B9CA-353F334214CC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{228B0751-AE25-4A7E-B26C-4A71D3B48DB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{228B0751-AE25-4A7E-B26C-4A71D3B48DB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{228B0751-AE25-4A7E-B26C-4A71D3B48DB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{228B0751-AE25-4A7E-B26C-4A71D3B48DB7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{16ED9B03-680A-4707-A5D8-13A9A0FF0323}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{16ED9B03-680A-4707-A5D8-13A9A0FF0323}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{16ED9B03-680A-4707-A5D8-13A9A0FF0323}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{16ED9B03-680A-4707-A5D8-13A9A0FF0323}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{22B1AA8B-7648-4035-9977-4CD68E577FFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{22B1AA8B-7648-4035-9977-4CD68E577FFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{22B1AA8B-7648-4035-9977-4CD68E577FFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{22B1AA8B-7648-4035-9977-4CD68E577FFF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{2D90677D-CB86-4DE5-912B-667157E8D848}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2D90677D-CB86-4DE5-912B-667157E8D848}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2D90677D-CB86-4DE5-912B-667157E8D848}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{2D90677D-CB86-4DE5-912B-667157E8D848}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{2F93CBEC-DA70-4A02-B694-910CB5D2FDBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2F93CBEC-DA70-4A02-B694-910CB5D2FDBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2F93CBEC-DA70-4A02-B694-910CB5D2FDBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{2F93CBEC-DA70-4A02-B694-910CB5D2FDBA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{AFE0112F-E5CA-4EAE-A4FF-F41352E448F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{AFE0112F-E5CA-4EAE-A4FF-F41352E448F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{AFE0112F-E5CA-4EAE-A4FF-F41352E448F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{AFE0112F-E5CA-4EAE-A4FF-F41352E448F8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{9755E0CD-EA75-4006-8657-08B0A465C884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{9755E0CD-EA75-4006-8657-08B0A465C884}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{9755E0CD-EA75-4006-8657-08B0A465C884}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{9755E0CD-EA75-4006-8657-08B0A465C884}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
Reference in New Issue
Block a user