Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.20 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace Delegates.TreeTraversal
  5. {
  6.     static class Traversal
  7.     {
  8.         public static IEnumerable<Product> GetProducts(ProductCategory data) =>
  9.             Executor<Product, ProductCategory>.Execute(data,
  10.                 (d) => d != null,
  11.                 (d) => new object[] { d.Categories, d.Products },
  12.                 (d) => d as Product);
  13.  
  14.         public static IEnumerable<int> GetBinaryTreeValues(BinaryTree<int> data) =>
  15.             Executor<int, BinaryTree<int>>.Execute(data,
  16.                 (d) => d != null,
  17.                 (d) => new object[] { d.Value, d.Left, d.Right },
  18.                 (d) => int.Parse(d.ToString()));
  19.  
  20.         public static IEnumerable<Job> GetEndJobs(Job data) =>
  21.             Executor<Job, Job>.Execute(data,
  22.                 (d) => (d is List<Job>) && (d as List<Job>).Count > 0,
  23.                 (d) => new object[] { d.Subjobs, d },
  24.                 (d) => d as Job);
  25.     }
  26.  
  27.     class Executor<T1, T2> where T2 : class
  28.     {
  29.         public static IEnumerable<T1> Execute(
  30.             T2 data,
  31.             Func<object, bool> check,
  32.             Func<T2, IEnumerable<object>> getParametrs,
  33.             Func<object, T1> translate)
  34.         {
  35.             var parametrs = getParametrs(data);
  36.             var notChecked = true;
  37.             foreach (var p in parametrs)
  38.                 if (check(p))
  39.                 {
  40.                     if (p is List<T2>)
  41.                         foreach (var e in p as List<T2>)
  42.                             foreach (var r in Execute(e, check, getParametrs, translate))
  43.                                 yield return r;
  44.                     else if (p is T2)
  45.                         foreach (var e in Execute(p as T2, check, getParametrs, translate))
  46.                             yield return e;
  47.                     else if (p is List<T1>)
  48.                         foreach (var e in p as List<T1>)
  49.                             yield return e;
  50.                     else
  51.                         yield return translate(p);
  52.                     notChecked = false;
  53.                 }
  54.                 else if (p is T1 && notChecked)
  55.                     yield return translate(p);
  56.         }
  57.     }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement