// *********************************************************************** // Assembly : Construction // Author : zjx // Created : 09-15-2020 // // Last Modified By : zjx // Last Modified On : 09-15-2020 // *********************************************************************** // // Copyright (c) jindongfang. All rights reserved. // // // *********************************************************************** using System; using System.Collections.Generic; using System.Linq; namespace WellWorkDataUI { /// /// Class HierarchyHelp. /// public static class HierarchyHelp { /// /// Loops the descendants. /// /// T /// The data. /// The element. /// The pred. /// The action. public static void LoopDescendants(IEnumerable data, T element, Func pred, Action action) { foreach (T item in data) { if (pred(element, item)) { action(element, item); LoopDescendants(data, item, pred, action); } } } /// /// Enums the descendants. /// /// T /// The data. /// The element. /// The pred. /// IEnumerable<T>. public static IEnumerable EnumDescendants(IEnumerable data, T element, Func pred) { foreach (T item in data) { if (pred(element, item)) { yield return item; foreach (T item2 in EnumDescendants(data, item, pred)) { yield return item2; } } } } /// /// Enums the descendants. /// /// T /// The data. /// The element. /// The pred. /// IEnumerable<T>. public static IEnumerable EnumDescendantsWithElements(IEnumerable data, T element, Func pred) { yield return element; foreach (T item in data) { if (pred(element, item)) { yield return item; foreach (T item2 in EnumDescendants(data, item, pred)) { yield return item2; } } } } /// /// Enums the descendants. /// /// T /// The data. /// The elements. /// The pred. /// IEnumerable<T>. public static IEnumerable EnumDescendants(IEnumerable data, IEnumerable elements, Func pred) { foreach (T element in elements) { foreach (T item in EnumDescendants(data, element, pred)) { yield return item; } } } /// /// Enums the descendants. /// /// T /// The data. /// The elements. /// The pred. /// IEnumerable<T>. public static IEnumerable EnumDescendantsWithElements(IEnumerable data, IEnumerable elements, Func pred) { foreach (T element in elements) { yield return element; foreach (T item in EnumDescendants(data, element, pred)) { yield return item; } } } /// /// Enums the ancestors. /// /// T /// The data. /// The elements. /// The pred. /// IEnumerable<T>. public static IEnumerable EnumAncestorsWithElements(IEnumerable data, IEnumerable elements, Func pred) { HashSet set = new HashSet(); foreach (T item in elements) { T tmp = item; do { set.Add(tmp); tmp = data.FirstOrDefault(o => pred(o, tmp)); } while (tmp != null); } return set; } } }