parent
4acd09f034
commit
a474b715fd
@ -0,0 +1,3 @@ |
||||
{ |
||||
"dotnet.defaultSolution": "AdvancedC#Grammer/MySolution/MySolution.sln" |
||||
} |
@ -0,0 +1,10 @@ |
||||
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
||||
<PropertyGroup> |
||||
<OutputType>Exe</OutputType> |
||||
<TargetFramework>net7.0</TargetFramework> |
||||
<ImplicitUsings>enable</ImplicitUsings> |
||||
<Nullable>enable</Nullable> |
||||
</PropertyGroup> |
||||
|
||||
</Project> |
@ -0,0 +1,47 @@ |
||||
namespace MyConsoleApp.Work |
||||
{ |
||||
public class AsyncAwaitWork |
||||
{ |
||||
private static Task Test() |
||||
{ |
||||
System.Console.WriteLine("Start Test"); |
||||
Task t = Task.Delay(3000); |
||||
return t; |
||||
} |
||||
|
||||
private static async void TestAsync() |
||||
{ |
||||
System.Console.WriteLine("Start Test"); |
||||
Task t = Task.Delay(3000); |
||||
await t; // 함수 내부에서는 동기, 함수 호출부에서는 비동기로 처리됨 |
||||
System.Console.WriteLine("End TestAsync"); |
||||
} |
||||
|
||||
private static async Task<int> TestAsync2() |
||||
{ |
||||
System.Console.WriteLine("Start Test"); |
||||
Task t = Task.Delay(3000); |
||||
await t; |
||||
System.Console.WriteLine("End TestAsync"); |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
public async static void DoTest() |
||||
{ |
||||
// Task t = Test(); |
||||
// t.Wait(); |
||||
|
||||
//TestAsync(); |
||||
await TestAsync2(); // 메인 함수도 동기로 처리됨 |
||||
|
||||
int res = await TestAsync2(); |
||||
|
||||
System.Console.WriteLine("While start"); |
||||
while (true) |
||||
{ |
||||
|
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,160 @@ |
||||
using System.Diagnostics; |
||||
using System.Security.Cryptography; |
||||
|
||||
namespace MyConsoleApp.Work |
||||
{ |
||||
public class LinqWork |
||||
{ |
||||
private static List<Player> _players = new List<Player>(); |
||||
|
||||
private static void InitInstance() |
||||
{ |
||||
Random rand = new Random(); |
||||
for (int i = 0; i < 100; i++) |
||||
{ |
||||
ClassType type = ClassType.Knight; |
||||
switch (rand.Next(0, 3)) |
||||
{ |
||||
case 1: |
||||
type = ClassType.Archer; |
||||
break; |
||||
case 2: |
||||
type = ClassType.Mage; |
||||
break; |
||||
} |
||||
|
||||
Player player = new Player() |
||||
{ |
||||
ClassType = type, |
||||
Level = rand.Next(1, 100), |
||||
Hp = rand.Next(100, 1000), |
||||
Attack = rand.Next(5, 50) |
||||
}; |
||||
|
||||
for (int j = 0; j < 5; j++) |
||||
{ |
||||
player.Items.Add(rand.Next(1, 100)); |
||||
} |
||||
|
||||
_players.Add(player); |
||||
} |
||||
} |
||||
|
||||
public static void DoTest() |
||||
{ |
||||
InitInstance(); |
||||
|
||||
// Q1) 레벨 50 이상인 Knight를 레벨 오름차순으로 정렬 |
||||
|
||||
Stopwatch sw = new Stopwatch(); |
||||
sw.Start(); |
||||
// Without Linq |
||||
{ |
||||
List<Player> players = GetHighLevelKnight(); |
||||
foreach (Player player in players) |
||||
{ |
||||
System.Console.WriteLine($"[{player.Level}] {player.Hp}"); |
||||
} |
||||
} |
||||
System.Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); |
||||
|
||||
System.Console.WriteLine("---------------------"); |
||||
|
||||
sw.Restart(); |
||||
// With Linq |
||||
{ |
||||
var players = |
||||
from p in _players |
||||
where p.ClassType == ClassType.Knight && p.Level >= 50 |
||||
orderby p.Level |
||||
select p; |
||||
|
||||
foreach (Player player in players) |
||||
{ |
||||
System.Console.WriteLine($"[{player.Level}] {player.Hp}"); |
||||
} |
||||
} |
||||
System.Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); |
||||
|
||||
// from 중첩 |
||||
// Q2) id가 30 미만인 모든 아이템 목록 추출 |
||||
{ |
||||
var playerItems = |
||||
from p in _players |
||||
from i in p.Items |
||||
where i < 30 |
||||
select new { p, i }; |
||||
|
||||
var li = playerItems.ToList(); |
||||
System.Console.WriteLine($"Count: {li.Count}"); |
||||
} |
||||
|
||||
// grouping |
||||
{ |
||||
var playerByLevel = |
||||
from p in _players |
||||
group p by p.Level into g |
||||
orderby g.Key |
||||
select new { g.Key, Players = g }; |
||||
} |
||||
|
||||
// join |
||||
{ |
||||
List<int> levels = new List<int>() { 1, 5, 10 }; |
||||
var players = |
||||
from p in _players |
||||
join l in levels |
||||
on p.Level equals l |
||||
select p; |
||||
} |
||||
|
||||
// Linq 표준 연산자 |
||||
{ |
||||
var players = |
||||
from p in _players |
||||
where p.ClassType == ClassType.Knight && p.Level >= 50 |
||||
orderby p.Level |
||||
select p; |
||||
|
||||
var players2 = _players |
||||
.Where(p => p.ClassType == ClassType.Knight && p.Level >= 50) |
||||
.OrderBy(p => p.Level) |
||||
.Select(p => p); |
||||
} |
||||
} |
||||
|
||||
private static List<Player> GetHighLevelKnight() |
||||
{ |
||||
List<Player> players = new List<Player>(); |
||||
foreach (Player player in _players) |
||||
{ |
||||
if (player.ClassType != ClassType.Knight) |
||||
continue; |
||||
if (player.Level < 50) |
||||
continue; |
||||
|
||||
players.Add(player); |
||||
} |
||||
|
||||
players.Sort((lhs, rhs) => { return lhs.Level - rhs.Level; }); |
||||
|
||||
return players; |
||||
} |
||||
} |
||||
|
||||
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>(); |
||||
} |
||||
} |
Loading…
Reference in new issue