瀏覽代碼

树形函数补充

懒得勤快 4 年之前
父節點
當前提交
4e7f1113b3
共有 1 個文件被更改,包括 121 次插入2 次删除
  1. 121 2
      Masuit.Tools.Abstractions/Models/TreeExtensions.cs

+ 121 - 2
Masuit.Tools.Abstractions/Models/TreeExtensions.cs

@@ -32,6 +32,29 @@ namespace Masuit.Tools.Models
             return results;
         }
 
+        /// <summary>
+        /// 过滤
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="items"></param>
+        /// <param name="func"></param>
+        /// <returns></returns>
+        public static IEnumerable<Tree<T>> Filter<T>(this IEnumerable<Tree<T>> items, Func<Tree<T>, bool> func) where T : class
+        {
+            var results = new List<Tree<T>>();
+            foreach (var item in items.Where(i => i != null))
+            {
+                item.Children ??= new List<Tree<T>>();
+                item.Children = item.Children.Filter(func).ToList();
+                if (item.Children.Any() || func(item))
+                {
+                    results.Add(item);
+                }
+            }
+
+            return results;
+        }
+
         /// <summary>
         /// 过滤
         /// </summary>
@@ -44,6 +67,18 @@ namespace Masuit.Tools.Models
             return new[] { item }.Filter(func);
         }
 
+        /// <summary>
+        /// 过滤
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="item"></param>
+        /// <param name="func"></param>
+        /// <returns></returns>
+        public static IEnumerable<Tree<T>> Filter<T>(this Tree<T> item, Func<Tree<T>, bool> func) where T : class
+        {
+            return new[] { item }.Filter(func);
+        }
+
         /// <summary>
         /// 平铺开
         /// </summary>
@@ -103,6 +138,65 @@ namespace Masuit.Tools.Models
             return result;
         }
 
+        /// <summary>
+        /// 平铺开
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="items"></param>
+        /// <returns></returns>
+        public static IEnumerable<Tree<T>> Flatten<T>(this IEnumerable<Tree<T>> items) where T : class
+        {
+            var result = new List<Tree<T>>();
+            foreach (var item in items)
+            {
+                result.Add(item);
+                item.Children ??= new List<Tree<T>>();
+                result.AddRange(item.Children.Flatten());
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 平铺开
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        public static IEnumerable<Tree<T>> Flatten<T>(this Tree<T> p) where T : class
+        {
+            var result = new List<Tree<T>>()
+            {
+                p
+            };
+            foreach (var item in p.Children)
+            {
+                result.Add(item);
+                item.Children ??= new List<Tree<T>>();
+                result.AddRange(item.Children.Flatten());
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 平铺开任意树形结构数据
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="items"></param>
+        /// <param name="selector"></param>
+        /// <returns></returns>
+        public static IEnumerable<Tree<T>> Flatten<T>(this IEnumerable<Tree<T>> items, Func<Tree<T>, IEnumerable<Tree<T>>> selector)
+        {
+            var result = new List<Tree<T>>();
+            foreach (var item in items)
+            {
+                result.Add(item);
+                result.AddRange(selector(item).Flatten(selector));
+            }
+
+            return result;
+        }
+
         /// <summary>
         /// 平行集合转换成树形结构
         /// </summary>
@@ -256,7 +350,17 @@ namespace Masuit.Tools.Models
         /// <summary>
         /// 所有子级
         /// </summary>
-        public static ICollection<T> AllChildren<T>(this T tree, Func<T, IEnumerable<T>> selector) => GetChildren(tree, selector);
+        public static ICollection<T> AllChildren<T>(this T tree, Func<T, IEnumerable<T>> selector) where T : ITreeChildren<T> => GetChildren(tree, selector);
+
+        /// <summary>
+        /// 所有子级
+        /// </summary>
+        public static ICollection<Tree<T>> AllChildren<T>(this Tree<T> tree) => GetChildren(tree, c => c.Children);
+
+        /// <summary>
+        /// 所有子级
+        /// </summary>
+        public static ICollection<Tree<T>> AllChildren<T>(this Tree<T> tree, Func<Tree<T>, IEnumerable<Tree<T>>> selector) => GetChildren(tree, selector);
 
         /// <summary>
         /// 所有父级
@@ -266,7 +370,12 @@ namespace Masuit.Tools.Models
         /// <summary>
         /// 所有父级
         /// </summary>
-        public static ICollection<T> AllParent<T>(this T tree, Func<T, T> selector) => GetParents(tree, selector);
+        public static ICollection<T> AllParent<T>(this T tree, Func<T, T> selector) where T : ITreeParent<T> => GetParents(tree, selector);
+
+        /// <summary>
+        /// 所有父级
+        /// </summary>
+        public static ICollection<Tree<T>> AllParent<T>(this Tree<T> tree, Func<Tree<T>, Tree<T>> selector) => GetParents(tree, selector);
 
         /// <summary>
         /// 是否是根节点
@@ -278,6 +387,16 @@ namespace Masuit.Tools.Models
         /// </summary>
         public static bool IsLeaf<T>(this ITreeChildren<T> tree) where T : ITreeChildren<T> => tree.Children?.Count == 0;
 
+        /// <summary>
+        /// 是否是根节点
+        /// </summary>
+        public static bool IsRoot<T>(this Tree<T> tree) => tree.Parent == null;
+
+        /// <summary>
+        /// 是否是叶子节点
+        /// </summary>
+        public static bool IsLeaf<T>(this Tree<T> tree) => tree.Children?.Count == 0;
+
         /// <summary>
         /// 深度层级
         /// </summary>