1
0

Program.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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. }
  22. [Demo(11, "LINQ to Objects for IEnumerable<T>")]
  23. static void Linq()
  24. {
  25. var xs = new List<int> { 1, 2, 3 };
  26. var ys = xs.Where(x => x % 2 == 0);
  27. foreach (var y in ys)
  28. {
  29. Console.WriteLine(y);
  30. }
  31. }
  32. [Demo(12, "LINQ to Objects for IQueryable<T>")]
  33. static void LinqQueryable()
  34. {
  35. var xs = new List<int> { 1, 2, 3 }.AsQueryable();
  36. var ys = xs.Where(x => x % 2 == 0);
  37. foreach (var y in ys)
  38. {
  39. Console.WriteLine(y);
  40. }
  41. }
  42. [Demo(21, "LINQ to Objects for IEnumerable<T> - Interactive Extensions")]
  43. static void Ix()
  44. {
  45. var xs = new List<int> { 1, 2, 3 };
  46. var ys = xs.Distinct(x => x % 2);
  47. foreach (var y in ys)
  48. {
  49. Console.WriteLine(y);
  50. }
  51. }
  52. [Demo(22, "LINQ to Objects for IQueryable<T> - Interactive Extensions")]
  53. static void IxQueryable()
  54. {
  55. var xs = new List<int> { 1, 2, 3 }.AsQueryable();
  56. var ys = xs.Distinct(x => x % 2);
  57. foreach (var y in ys)
  58. {
  59. Console.WriteLine(y);
  60. }
  61. }
  62. [Demo(31, "LINQ to Objects for IAsyncEnumerable<T>")]
  63. static async Task AsyncLinq()
  64. {
  65. var xs = new List<int> { 1, 2, 3 };
  66. var ys = xs.ToAsyncEnumerable().Where(x => x % 2 == 0);
  67. #if CSHARP8
  68. foreach await (var y in ys)
  69. {
  70. Console.WriteLine(y);
  71. }
  72. #else
  73. var e = ys.GetAsyncEnumerator();
  74. try
  75. {
  76. while (await e.MoveNextAsync())
  77. {
  78. var y = e.Current;
  79. Console.WriteLine(y);
  80. }
  81. }
  82. finally
  83. {
  84. await e.DisposeAsync();
  85. }
  86. #endif
  87. }
  88. [Demo(32, "LINQ to Objects for IAsyncQueryable<T>")]
  89. static async Task AsyncLinqQueryable()
  90. {
  91. var xs = new List<int> { 1, 2, 3 }.AsQueryable();
  92. var ys = xs.ToAsyncEnumerable().Where(x => x % 2 == 0);
  93. #if CSHARP8
  94. foreach await (var y in ys)
  95. {
  96. Console.WriteLine(y);
  97. }
  98. #else
  99. var e = ys.GetAsyncEnumerator();
  100. try
  101. {
  102. while (await e.MoveNextAsync())
  103. {
  104. var y = e.Current;
  105. Console.WriteLine(y);
  106. }
  107. }
  108. finally
  109. {
  110. await e.DisposeAsync();
  111. }
  112. #endif
  113. }
  114. [Demo(41, "LINQ to Objects for IAsyncEnumerable<T> - Interactive Extensions")]
  115. static async Task AsyncIx()
  116. {
  117. var xs = new List<int> { 1, 2, 3 };
  118. var ys = xs.ToAsyncEnumerable().Distinct(x => x % 2);
  119. #if CSHARP8
  120. foreach await (var y in ys)
  121. {
  122. Console.WriteLine(y);
  123. }
  124. #else
  125. await ys.ForEachAsync(y =>
  126. {
  127. Console.WriteLine(y);
  128. });
  129. #endif
  130. }
  131. [Demo(42, "LINQ to Objects for IAsyncQueryable<T> - Interactive Extensions")]
  132. static async Task AsyncIxQueryable()
  133. {
  134. var xs = new List<int> { 1, 2, 3 }.AsQueryable();
  135. var ys = xs.ToAsyncEnumerable().Distinct(x => x % 2);
  136. #if CSHARP8
  137. foreach await (var y in ys)
  138. {
  139. Console.WriteLine(y);
  140. }
  141. #else
  142. await ys.ForEachAsync(y =>
  143. {
  144. Console.WriteLine(y);
  145. });
  146. #endif
  147. }
  148. static void RunDemos()
  149. {
  150. var methods = (from method in typeof(Program).GetTypeInfo().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
  151. let demo = method.GetCustomAttribute<DemoAttribute>()
  152. let parameters = method.GetParameters()
  153. let returnType = method.ReturnType
  154. where demo != null && parameters.Length == 0 && (returnType == typeof(void) || returnType == typeof(Task))
  155. orderby demo.Index
  156. select new { Demo = demo, Invoke = GetInvoker(method) })
  157. .ToArray();
  158. var invokers = methods.ToDictionary(m => m.Demo.Index, m => m.Invoke);
  159. while (true)
  160. {
  161. foreach (var method in methods)
  162. {
  163. Console.WriteLine($"{method.Demo.Index}. {method.Demo.Title}");
  164. }
  165. Console.WriteLine();
  166. var retry = true;
  167. while (retry)
  168. {
  169. Console.Write("Enter demo [C: Clear, X: Exit]: ");
  170. var input = Console.ReadLine().Trim().ToUpper();
  171. switch (input)
  172. {
  173. case "C":
  174. retry = false;
  175. Console.Clear();
  176. break;
  177. case "X":
  178. return;
  179. default:
  180. if (!int.TryParse(input, out var i) || !invokers.TryGetValue(i, out var invoke))
  181. {
  182. Console.ForegroundColor = ConsoleColor.Red;
  183. Console.WriteLine("Invalid input.");
  184. Console.ResetColor();
  185. }
  186. else
  187. {
  188. retry = false;
  189. Console.ForegroundColor = ConsoleColor.Cyan;
  190. try
  191. {
  192. invoke();
  193. }
  194. catch (Exception ex)
  195. {
  196. Console.ForegroundColor = ConsoleColor.Red;
  197. Console.WriteLine(ex.Message);
  198. }
  199. finally
  200. {
  201. Console.ResetColor();
  202. }
  203. }
  204. break;
  205. }
  206. }
  207. }
  208. Action GetInvoker(MethodInfo method)
  209. {
  210. if (method.ReturnType == typeof(void))
  211. {
  212. return (Action)method.CreateDelegate(typeof(Action));
  213. }
  214. else
  215. {
  216. var invoke = (Func<Task>)method.CreateDelegate(typeof(Func<Task>));
  217. return () => invoke().GetAwaiter().GetResult();
  218. }
  219. }
  220. }
  221. }
  222. }