internal static TreeItemHolder <T> Search <T>(TreeItemHolder <T> treeHolder, Func <T, string> getId, string idToSearch) { //如果不传入参数,搜索返回null if (string.IsNullOrEmpty(idToSearch)) { return(null); } //是否是当前的树 var id = getId(treeHolder.Value); if (idToSearch.NbEquals(id)) { return(treeHolder); } //如果不是当前的树,递归向下查找 if (!treeHolder.Children.IsNullOrEmpty()) { return(treeHolder.Children.Select(item => Search(item, getId, idToSearch)) .FirstOrDefault()); } //没有找到 return(null); }
private void ShowTreeHolder(TreeItemHolder <MockTreeItem> holder) { Console.WriteLine(holder.Value); foreach (var childHolder in holder.Children) { ShowTreeHolder(childHolder); } }
public void ConvertToHolders_top_level_should_ok() { var perCount = 2; var maxDeep = 3; var mockTreeItems = MockTreeItem.Create(perCount, maxDeep); var treeItemHolders = TreeItemHolder <MockTreeItem> .ConvertToHolders(mockTreeItems, item => item.Id, item => item.ParentId, null); ShowTreeHolders(treeItemHolders); treeItemHolders.Count.ShouldEqual(2); }
public void MaxDeep_should_ok() { var perCount = 1; var maxDeep = 4; var mockTreeItems = MockTreeItem.Create(perCount, maxDeep); var treeItemHolders = TreeItemHolder <MockTreeItem> .ConvertToHolders(mockTreeItems, item => item.Id, item => item.ParentId, null); ShowTreeHolders(treeItemHolders); var treeItemHolder = treeItemHolders[0]; treeItemHolder.MaxDeep().ShouldEqual(maxDeep); }
internal static TreeItemHolder <T> ConvertToHolder <T>(IList <T> treeItems, T currentItem, Func <T, string> getId, Func <T, string> getParentId) { var currentHolder = new TreeItemHolder <T>(currentItem); string currentId = getId.Invoke(currentItem); var childItems = treeItems.Where(x => getParentId(x).NbEquals(currentId)).ToList(); foreach (var childItem in childItems) { var childHolder = ConvertToHolder(treeItems, childItem, getId, getParentId); currentHolder.Children.Add(childHolder); } return(currentHolder); }
public void Search_should_ok() { var perCount = 2; var maxDeep = 3; var mockTreeItems = MockTreeItem.Create(perCount, maxDeep); var treeItemHolders = TreeItemHolder <MockTreeItem> .ConvertToHolders(mockTreeItems, item => item.Id, item => item.ParentId, null); ShowTreeHolders(treeItemHolders); var treeItemHolder = treeItemHolders[0]; treeItemHolder.Search(item => item.Id, "NotExistId").ShouldNull("NotExistId"); treeItemHolder.Search(item => item.Id, "1.").ShouldNotNull(); treeItemHolder.Search(item => item.Id, "1.1.").ShouldNotNull(); treeItemHolder.Search(item => item.Id, "1.1.1.").ShouldNotNull(); }
public static IList <MockTreeItemTree> ConvertTrees(IList <MockTreeItem> items) { var trees = new List <MockTreeItemTree>(); if (items.IsNullOrEmpty()) { return(trees); } var holders = TreeItemHolder <MockTreeItem> .ConvertToHolders(items, item => item.Id, item => item.ParentId, null); foreach (var holder in holders) { var itemTree = holder.ConvertToTree(item => item.ToMapped <MockTreeItemTree>(), tree => tree.Children); trees.Add(itemTree); } return(trees); }
internal static TreeItemHolder <T> SearchChild <T>(TreeItemHolder <T> treeHolder, Func <T, string> getId, string idToSearch, bool recursive) { if (string.IsNullOrEmpty(idToSearch) || treeHolder == null || treeHolder.Children.IsNullOrEmpty()) { return(null); } var theOne = treeHolder.Children.FirstOrDefault(item => idToSearch.NbEquals(getId(item.Value))); if (theOne != null) { return(theOne); } if (recursive) { return(treeHolder.Children.Select(childHolder => SearchChild(childHolder, getId, idToSearch, true)) .FirstOrDefault(theOne2 => theOne2 != null)); } //没有找到 return(null); }
public void ConvertToTree_should_ok() { var perCount = 2; var maxDeep = 3; var mockTreeItems = MockTreeItem.Create(perCount, maxDeep); var treeItemHolders = TreeItemHolder <MockTreeItem> .ConvertToHolders(mockTreeItems, item => item.Id, item => item.ParentId, null); ShowTreeHolders(treeItemHolders); var treeItemHolder = treeItemHolders[0]; var mockTreeItemTree = treeItemHolder.ConvertToTree( item => item.ToMapped <MockTreeItemTree>(), tree => tree.Children); AssertChildren(mockTreeItemTree, 1, perCount); foreach (var childTree in mockTreeItemTree.Children) { AssertChildren(childTree, 2, perCount); foreach (var childChildTree in childTree.Children) { AssertChildren(childChildTree, 3, 0); } } }