Program.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Threading.Tasks;
  9. namespace Playground
  10. {
  11. class Program
  12. {
  13. static void Main()
  14. {
  15. RunDemos();
  16. }
  17. [Demo(0, "Random experimentation")]
  18. static async Task Experiment()
  19. {
  20. // Add test code here
  21. await Task.Yield();
  22. }
  23. [Demo(1, "LINQ to Objects for IEnumerable<T>")]
  24. static void Linq()
  25. {
  26. var xs = new List<int> { 1, 2, 3 };
  27. var ys = xs.Where(x => x % 2 == 0);
  28. foreach (var y in ys)
  29. {
  30. Console.WriteLine(y);
  31. }
  32. }
  33. [Demo(2, "LINQ to Objects for IEnumerable<T> - Interactive Extensions")]
  34. static void Ix()
  35. {
  36. var xs = new List<int> { 1, 2, 3 };
  37. var ys = xs.Distinct(x => x % 2);
  38. foreach (var y in ys)
  39. {
  40. Console.WriteLine(y);
  41. }
  42. }
  43. [Demo(3, "LINQ to Objects for IAsyncEnumerable<T>")]
  44. static async Task AsyncLinq()
  45. {
  46. var xs = new List<int> { 1, 2, 3 };
  47. var ys = xs.ToAsyncEnumerable().Where(x => x % 2 == 0);
  48. #if CSHARP8
  49. foreach await (var y in ys)
  50. {
  51. Console.WriteLine(y);
  52. }
  53. #else
  54. var e = ys.GetAsyncEnumerator();
  55. try
  56. {
  57. while (await e.MoveNextAsync())
  58. {
  59. var y = e.Current;
  60. Console.WriteLine(y);
  61. }
  62. }
  63. finally
  64. {
  65. await e.DisposeAsync();
  66. }
  67. #endif
  68. }
  69. [Demo(4, "LINQ to Objects for IAsyncEnumerable<T> - Interactive Extensions")]
  70. static async Task AsyncIx()
  71. {
  72. var xs = new List<int> { 1, 2, 3 };
  73. var ys = xs.ToAsyncEnumerable().Distinct(x => x % 2);
  74. #if CSHARP8
  75. foreach await (var y in ys)
  76. {
  77. Console.WriteLine(y);
  78. }
  79. #else
  80. await ys.ForEachAsync(y =>
  81. {
  82. Console.WriteLine(y);
  83. });
  84. #endif
  85. }
  86. static void RunDemos()
  87. {
  88. var methods = (from method in typeof(Program).GetTypeInfo().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
  89. let demo = method.GetCustomAttribute<DemoAttribute>()
  90. let parameters = method.GetParameters()
  91. let returnType = method.ReturnType
  92. where demo != null && parameters.Length == 0 && (returnType == typeof(void) || returnType == typeof(Task))
  93. orderby demo.Index
  94. select new { Demo = demo, Invoke = GetInvoker(method) })
  95. .ToArray();
  96. var invokers = methods.ToDictionary(m => m.Demo.Index, m => m.Invoke);
  97. while (true)
  98. {
  99. foreach (var method in methods)
  100. {
  101. Console.WriteLine($"{method.Demo.Index}. {method.Demo.Title}");
  102. }
  103. Console.WriteLine();
  104. var retry = true;
  105. while (retry)
  106. {
  107. Console.Write("Enter demo [C: Clear, X: Exit]: ");
  108. var input = Console.ReadLine().Trim().ToUpper();
  109. switch (input)
  110. {
  111. case "C":
  112. retry = false;
  113. Console.Clear();
  114. break;
  115. case "X":
  116. return;
  117. default:
  118. if (!int.TryParse(input, out var i) || !invokers.TryGetValue(i, out var invoke))
  119. {
  120. Console.ForegroundColor = ConsoleColor.Red;
  121. Console.WriteLine("Invalid input.");
  122. Console.ResetColor();
  123. }
  124. else
  125. {
  126. retry = false;
  127. Console.ForegroundColor = ConsoleColor.Cyan;
  128. try
  129. {
  130. invoke();
  131. }
  132. catch (Exception ex)
  133. {
  134. Console.ForegroundColor = ConsoleColor.Red;
  135. Console.WriteLine(ex.Message);
  136. }
  137. finally
  138. {
  139. Console.ResetColor();
  140. }
  141. }
  142. break;
  143. }
  144. }
  145. }
  146. Action GetInvoker(MethodInfo method)
  147. {
  148. if (method.ReturnType == typeof(void))
  149. {
  150. return (Action)method.CreateDelegate(typeof(Action));
  151. }
  152. else
  153. {
  154. var invoke = (Func<Task>)method.CreateDelegate(typeof(Func<Task>));
  155. return () => invoke().GetAwaiter().GetResult();
  156. }
  157. }
  158. }
  159. }
  160. }