EnumerableExtensions.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Avalonia.Controls.UnitTests
  5. {
  6. internal static class EnumerableExtensions
  7. {
  8. public static IEnumerable<T> Do<T>(this IEnumerable<T> items, Action<T> action)
  9. {
  10. foreach (var i in items)
  11. {
  12. action(i);
  13. yield return i;
  14. }
  15. }
  16. public static IEnumerable<T[]> Permutations<T>(this IEnumerable<T> source)
  17. {
  18. var sourceArray = source.ToArray();
  19. var results = new List<T[]>();
  20. Permute(sourceArray, 0, sourceArray.Length - 1);
  21. return results;
  22. void Permute(T[] elements, int depth, int maxDepth)
  23. {
  24. if (depth == maxDepth)
  25. {
  26. results.Add(elements.ToArray());
  27. return;
  28. }
  29. for (var i = depth; i <= maxDepth; i++)
  30. {
  31. (elements[depth], elements[i]) = (elements[i], elements[depth]);
  32. Permute(elements, depth + 1, maxDepth);
  33. (elements[depth], elements[i]) = (elements[i], elements[depth]);
  34. }
  35. }
  36. }
  37. }
  38. }