using MyCode.Project.Infrastructure.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyCode.Project.Infrastructure.Trees
{
///
/// 树节点上下文
///
/// 实体类型
/// 输出类型
public class TreeContext : ITreeContext
{
///
/// 数据源
///
public List> Data { get; set; }
///
/// 当前节点
///
public TreeNode Current { get; set; }
///
/// 分隔符
///
public string Separator { get; set; } = ".";
///
/// 初始化一个类型的实例
///
public TreeContext() : this(null)
{
}
///
/// 初始化一个类型的实例
///
/// 节点
public TreeContext(TreeNode node)
{
Current = node;
Data = new List>();
}
///
/// 设置树节点列表数据源
///
/// 键类型
/// 数据源
/// 显示文本选择器
/// ID选择器
/// 父ID选择器
///
public ITreeContext SetItems(List collection, Func textSelector,
Func idSelector, Func parentIdSelector)
{
Data = GenerateTree(collection, textSelector, idSelector, parentIdSelector, Current).ToList();
if (Current != null)
{
Current.Children = Data;
}
return this;
}
///
/// 设置树节点列表数据源
///
/// 键类型
/// 数据源
/// 显示文本选择器
/// ID选择器
/// 父ID选择器
/// 转换选择器
///
public ITreeContext SetItems(List collection, Func textSelector,
Func idSelector, Func parentIdSelector, Func convertSelector)
{
Data = GenerateTree(collection, textSelector, idSelector, parentIdSelector, Current, convertSelector).ToList();
if (Current != null)
{
Current.Children = Data;
}
return this;
}
///
/// 获取当前树节点
///
///
public TreeNode GetTreeNode()
{
return Current;
}
///
/// 获取树节点
///
///
public List> GetTrees()
{
return Data;
}
///
/// 生成树
///
/// 键类型
/// 数据源
/// 显示文本选择器
/// ID选择器
/// 父ID选择器
/// 父节点
/// 转换选择器
///
internal IEnumerable> GenerateTree(List collection, Func textSelector,
Func idSelector, Func parentIdSelector, TreeNode parentNode,
Func convertSelector = null)
{
var level = parentNode == null || parentNode.Level == 0 ? 1 : parentNode.Level + 1;
foreach (var c in collection.Where(u =>
{
var selector = parentIdSelector(u);
return ((parentNode == null || parentNode.Id == null) && selector == null) ||
(parentNode?.Id != null && parentNode.Id.Equals(selector));
}).ToList())
{
TreeNode node = convertSelector == null
? new TreeNode(textSelector(c), Conv.To(c))
: new TreeNode(textSelector(c), convertSelector(c));
node.Id = idSelector(c);
node.ParentId = parentIdSelector(c);
node.Level = level;
node.Path = parentNode == null || parentNode.Level == 0
? node.Text
: $"{parentNode.Path}{Separator}{node.Text}";
node.Children = GenerateTree(collection, textSelector, idSelector, parentIdSelector, node,
convertSelector).ToList();
yield return node;
}
}
}
///
/// 树节点上下文
///
/// 实体类型
public class TreeContext : TreeContext, ITreeContext
{
///
/// 初始化一个类型的实例
///
public TreeContext() : base()
{
}
///
/// 初始化一个类型的实例
///
/// 根节点
public TreeContext(TreeNode rootNode) : base(rootNode)
{
}
}
}