Program.cs 7.6 KB

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