From 6ebd0fb5a9410ae6b530b2bc8a209160e0aa5f59 Mon Sep 17 00:00:00 2001 From: SONGQUE PARK Date: Wed, 5 Mar 2025 11:57:12 +0900 Subject: [PATCH] =?UTF-8?q?c#=20=EA=B8=B0=EC=B4=88=EA=B5=AC=EB=AC=B8=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ex0.HelloWorld/Ex0.HelloWorld.csproj | 10 ++ Ex0.HelloWorld/Program.cs | 2 + Ex2.Comment/Program.cs | 4 + ExR.Delegate2/ExR.Delegate2.csproj | 10 ++ ExR.Delegate2/Program.cs | 113 +++++++++++++++ ExS.Delegate3/ExS.Delegate3.csproj | 10 ++ ExS.Delegate3/Program.cs | 43 ++++++ ExT.AnonymousType/ExT.AnonymousType.csproj | 10 ++ ExT.AnonymousType/Program.cs | 31 +++++ .../ExU.ExtensionMethod.csproj | 10 ++ ExU.ExtensionMethod/Program.cs | 47 +++++++ ExV.DynamicType/ExV.DynamicType.csproj | 10 ++ ExV.DynamicType/Program.cs | 53 +++++++ ExW.PartialClass/ExW.PartialClass.csproj | 10 ++ ExW.PartialClass/Program.cs | 64 +++++++++ ExX.ActionFunc/ExX.ActionFunc.csproj | 10 ++ ExX.ActionFunc/Program.cs | 131 ++++++++++++++++++ ExY.Linq/ExY.Linq.csproj | 10 ++ ExY.Linq/Program.cs | 45 ++++++ ExZ.Task/ExZ.Task.csproj | 10 ++ ExZ.Task/Program.cs | 47 +++++++ Ojt.Lectures.sln | 60 ++++++++ 22 files changed, 740 insertions(+) create mode 100644 Ex0.HelloWorld/Ex0.HelloWorld.csproj create mode 100644 Ex0.HelloWorld/Program.cs create mode 100644 ExR.Delegate2/ExR.Delegate2.csproj create mode 100644 ExR.Delegate2/Program.cs create mode 100644 ExS.Delegate3/ExS.Delegate3.csproj create mode 100644 ExS.Delegate3/Program.cs create mode 100644 ExT.AnonymousType/ExT.AnonymousType.csproj create mode 100644 ExT.AnonymousType/Program.cs create mode 100644 ExU.ExtensionMethod/ExU.ExtensionMethod.csproj create mode 100644 ExU.ExtensionMethod/Program.cs create mode 100644 ExV.DynamicType/ExV.DynamicType.csproj create mode 100644 ExV.DynamicType/Program.cs create mode 100644 ExW.PartialClass/ExW.PartialClass.csproj create mode 100644 ExW.PartialClass/Program.cs create mode 100644 ExX.ActionFunc/ExX.ActionFunc.csproj create mode 100644 ExX.ActionFunc/Program.cs create mode 100644 ExY.Linq/ExY.Linq.csproj create mode 100644 ExY.Linq/Program.cs create mode 100644 ExZ.Task/ExZ.Task.csproj create mode 100644 ExZ.Task/Program.cs diff --git a/Ex0.HelloWorld/Ex0.HelloWorld.csproj b/Ex0.HelloWorld/Ex0.HelloWorld.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/Ex0.HelloWorld/Ex0.HelloWorld.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/Ex0.HelloWorld/Program.cs b/Ex0.HelloWorld/Program.cs new file mode 100644 index 0000000..3751555 --- /dev/null +++ b/Ex0.HelloWorld/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/Ex2.Comment/Program.cs b/Ex2.Comment/Program.cs index 68a5043..17ed88c 100644 --- a/Ex2.Comment/Program.cs +++ b/Ex2.Comment/Program.cs @@ -1,5 +1,9 @@ internal class Program { + /// + /// 클래스나 함수에 대한 코멘트 + /// + /// private static void Main(string[] args) { // 코멘트: 한 라인 코멘트는 두개의 슬래시 사용함 diff --git a/ExR.Delegate2/ExR.Delegate2.csproj b/ExR.Delegate2/ExR.Delegate2.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExR.Delegate2/ExR.Delegate2.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExR.Delegate2/Program.cs b/ExR.Delegate2/Program.cs new file mode 100644 index 0000000..976714c --- /dev/null +++ b/ExR.Delegate2/Program.cs @@ -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; + } +} \ No newline at end of file diff --git a/ExS.Delegate3/ExS.Delegate3.csproj b/ExS.Delegate3/ExS.Delegate3.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExS.Delegate3/ExS.Delegate3.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExS.Delegate3/Program.cs b/ExS.Delegate3/Program.cs new file mode 100644 index 0000000..731a1f6 --- /dev/null +++ b/ExS.Delegate3/Program.cs @@ -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? OnFinished2; + + public void Run(int complexity) + { + Thread.Sleep(complexity); + OnFinished?.Invoke(this, EventArgs.Empty); + OnFinished2?.Invoke(this, EventArgs.Empty); + } +} \ No newline at end of file diff --git a/ExT.AnonymousType/ExT.AnonymousType.csproj b/ExT.AnonymousType/ExT.AnonymousType.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExT.AnonymousType/ExT.AnonymousType.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExT.AnonymousType/Program.cs b/ExT.AnonymousType/Program.cs new file mode 100644 index 0000000..70eb0d1 --- /dev/null +++ b/ExT.AnonymousType/Program.cs @@ -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); + } +} \ No newline at end of file diff --git a/ExU.ExtensionMethod/ExU.ExtensionMethod.csproj b/ExU.ExtensionMethod/ExU.ExtensionMethod.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExU.ExtensionMethod/ExU.ExtensionMethod.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExU.ExtensionMethod/Program.cs b/ExU.ExtensionMethod/Program.cs new file mode 100644 index 0000000..e0ff3a7 --- /dev/null +++ b/ExU.ExtensionMethod/Program.cs @@ -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'); + } + +} \ No newline at end of file diff --git a/ExV.DynamicType/ExV.DynamicType.csproj b/ExV.DynamicType/ExV.DynamicType.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExV.DynamicType/ExV.DynamicType.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExV.DynamicType/Program.cs b/ExV.DynamicType/Program.cs new file mode 100644 index 0000000..95275dd --- /dev/null +++ b/ExV.DynamicType/Program.cs @@ -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); + } +} \ No newline at end of file diff --git a/ExW.PartialClass/ExW.PartialClass.csproj b/ExW.PartialClass/ExW.PartialClass.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExW.PartialClass/ExW.PartialClass.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExW.PartialClass/Program.cs b/ExW.PartialClass/Program.cs new file mode 100644 index 0000000..76c94cd --- /dev/null +++ b/ExW.PartialClass/Program.cs @@ -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() + { + } +} \ No newline at end of file diff --git a/ExX.ActionFunc/ExX.ActionFunc.csproj b/ExX.ActionFunc/ExX.ActionFunc.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExX.ActionFunc/ExX.ActionFunc.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExX.ActionFunc/Program.cs b/ExX.ActionFunc/Program.cs new file mode 100644 index 0000000..cc03f68 --- /dev/null +++ b/ExX.ActionFunc/Program.cs @@ -0,0 +1,131 @@ +internal class Program +{ + private static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + } +} + +class AClass +{ + public void Run() + { + // Action + // 입력 : T 타입 + // 리턴갑 : 없음 + + // 기존 메서드 지정 + System.Action act = Output; + act("Hello"); + + // 무명 메서드 지정 + Action act2 = delegate (string msg, string title) + { + Console.WriteLine(msg, title); + }; + act2("No data found", "Error"); + + // 람다식 사용 + Action act3 = code => Console.WriteLine("Code: {0}", code); + act3(1033); + } + + void Output(string s) + { + Console.WriteLine(s); + } +} + +class BClass +{ + int _state; + //--------------------- + // 예제 1 + // Func + // 입력: 없음 + // 리턴: TResult 타입 + //--------------------- + public void Run() + { + // 메서드 지정 + System.Func f = IsValid; + bool result = f(); + + // 무명 메서드 지정 + Func fa = delegate + { + return _state == 0; + }; + result = fa(); + + // 람다식 이용 + Func fb = () => _state == 0; + result = fb(); + } + + bool IsValid() + { + return _state == 0; + } + + //--------------------- + // 예제 2 + // Func + // 입력: 1개 + // 리턴: TResult 타입 + //--------------------- + public void Run1() + { + // 메서드 지정 + System.Func f = IsValidRange; + bool result = f(10); + + // 무명 메서드 지정 + Func fa = delegate (int n) + { + return n > 0; + }; + result = fa(-1); + + // 람다식 이용 + Func fb = n => n > 0; + result = fb(-2); + } + + bool IsValidRange(int n) + { + return n > 0; + } + + void Predicate() + { + // Predicate + Predicate p = delegate (int n) + { + return n >= 0; + }; + bool res = p(-1); + + Predicate p2 = s => s.StartsWith("A"); + res = p2("Apple"); + } + + public void UsePredicate() + { + int[] arr = { -10, 20, -30, 4, -5 }; + + // Predicate의 사용 + // Array.Find(int[], Predicate) + int pos = Array.Find(arr, IsPositive); + + // LINQ에서 Func의 사용 + // Where(Func predicate) + var v = arr.Where(n => n >= 0); + } + + bool IsPositive(int i) + { + return i >= 0; + } + +} \ No newline at end of file diff --git a/ExY.Linq/ExY.Linq.csproj b/ExY.Linq/ExY.Linq.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExY.Linq/ExY.Linq.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExY.Linq/Program.cs b/ExY.Linq/Program.cs new file mode 100644 index 0000000..a0babde --- /dev/null +++ b/ExY.Linq/Program.cs @@ -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 Orders = new(); +} + +class Order +{ + public string Customer_ID = string.Empty; + public DateTime Order_Date; + public List Items = new(); +} \ No newline at end of file diff --git a/ExZ.Task/ExZ.Task.csproj b/ExZ.Task/ExZ.Task.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/ExZ.Task/ExZ.Task.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/ExZ.Task/Program.cs b/ExZ.Task/Program.cs new file mode 100644 index 0000000..12447ea --- /dev/null +++ b/ExZ.Task/Program.cs @@ -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.Run(() => cls.ComplexCalc(3000)); + var task2 = Task.Run(() => cls.ComplexCalc(2000)); + Task[] tasks = { task1, task2 }; + + //먼저완료되는 타스크를 먼저처리 + var anytask = Task.WhenAny(tasks); + Task 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 ComplexCalcAsync(int complexity) + { + var task = Task.Run(() => ComplexCalc(complexity)); + // await 가 나오기 전까지 다른 동시작업 가능 + + var result = await task; + return result; + } + +} \ No newline at end of file diff --git a/Ojt.Lectures.sln b/Ojt.Lectures.sln index 352c070..64afb95 100644 --- a/Ojt.Lectures.sln +++ b/Ojt.Lectures.sln @@ -55,6 +55,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExP.Interface", "ExP.Interf EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExQ.Delegate1", "ExQ.Delegate1\ExQ.Delegate1.csproj", "{52E7A86E-720F-4111-AA1B-8C5FADE7E207}" 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 GlobalSection(SolutionConfigurationPlatforms) = preSolution 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}.Release|Any CPU.ActiveCfg = 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 GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE