private static IList <TreeingNode <T, TId> > LookupNodes <T, TId>(IEnumerable <T> items, TId?parentId, int depthLevel = 0) where T : IParentIdentifier <TId> where TId : IEquatable <TId> { var nodes = new List <TreeingNode <T, TId> >(); // 提取父元素集合 #pragma warning disable CS8602 // 解引用可能出现空引用。 var parents = items.Where(p => p.IsNotNull() && p.ParentId.Equals(parentId)); #pragma warning restore CS8602 // 解引用可能出现空引用。 if (parents.IsEmpty()) { return(nodes); } foreach (var p in parents) { var node = new TreeingNode <T, TId>(p, depthLevel); var children = LookupNodes(items, p.Id, node.DepthLevel + 1); node.Children = children; nodes.Add(node); } return(nodes); }
/// <summary> /// 是否包含指定标识的子节点。 /// </summary> /// <param name="childId">给定的子节点信号。</param> /// <param name="child">输出当前子节点。</param> /// <returns>返回布尔值。</returns> public virtual bool ContainsChild(TId childId, out TreeingNode <T, TId> child) { #pragma warning disable CS8601 // 可能的 null 引用赋值。 child = GetChild(childId); #pragma warning restore CS8601 // 可能的 null 引用赋值。 return(child.IsNotNull()); }
/// <summary> /// 是否相等。 /// </summary> /// <param name="other">给定的 <see cref="TreeingNode{T, TId}"/>。</param> /// <returns>返回布尔值。</returns> public virtual bool Equals(TreeingNode <T, TId>?other) { if (other is null) { return(false); } #pragma warning disable CS8602 // 解引用可能出现空引用。 return(Id.Equals(other.Id) && ParentId.Equals(other.ParentId)); #pragma warning restore CS8602 // 解引用可能出现空引用。 }