IEnumerableExtensions.cs 880 B

12345678910111213141516171819202122232425262728
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Rssdp.Infrastructure
  6. {
  7. internal static class IEnumerableExtensions
  8. {
  9. public static IEnumerable<T> SelectManyRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
  10. {
  11. if (source == null) throw new ArgumentNullException(nameof(source));
  12. if (selector == null) throw new ArgumentNullException(nameof(selector));
  13. return !source.Any() ? source :
  14. source.Concat(
  15. source
  16. .SelectMany(i => selector(i).EmptyIfNull())
  17. .SelectManyRecursive(selector)
  18. );
  19. }
  20. public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> source)
  21. {
  22. return source ?? Enumerable.Empty<T>();
  23. }
  24. }
  25. }