Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- namespace Delegates.TreeTraversal
- {
- static class Traversal
- {
- public static IEnumerable<Product> GetProducts(ProductCategory data) =>
- Executor<Product, ProductCategory>.Execute(data,
- (d) => d != null,
- (d) => new object[] { d.Categories, d.Products },
- (d) => d as Product);
- public static IEnumerable<int> GetBinaryTreeValues(BinaryTree<int> data) =>
- Executor<int, BinaryTree<int>>.Execute(data,
- (d) => d != null,
- (d) => new object[] { d.Value, d.Left, d.Right },
- (d) => int.Parse(d.ToString()));
- public static IEnumerable<Job> GetEndJobs(Job data) =>
- Executor<Job, Job>.Execute(data,
- (d) => (d is List<Job>) && (d as List<Job>).Count > 0,
- (d) => new object[] { d.Subjobs, d },
- (d) => d as Job);
- }
- class Executor<T1, T2> where T2 : class
- {
- public static IEnumerable<T1> Execute(
- T2 data,
- Func<object, bool> check,
- Func<T2, IEnumerable<object>> getParametrs,
- Func<object, T1> translate)
- {
- var parametrs = getParametrs(data);
- var notChecked = true;
- foreach (var p in parametrs)
- if (check(p))
- {
- if (p is List<T2>)
- foreach (var e in p as List<T2>)
- foreach (var r in Execute(e, check, getParametrs, translate))
- yield return r;
- else if (p is T2)
- foreach (var e in Execute(p as T2, check, getParametrs, translate))
- yield return e;
- else if (p is List<T1>)
- foreach (var e in p as List<T1>)
- yield return e;
- else
- yield return translate(p);
- notChecked = false;
- }
- else if (p is T1 && notChecked)
- yield return translate(p);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement