C# Net 树帮助类,树节点帮助类(非递归)
C# Net 树帮助类
C# Net 树节点帮助类
优点:非递归,效率可能更高
------------------------------------------------------------
---------------------文尾看调用方式------------------
------------------------------------------------------------
创建一个新的文件 ITreeNode.cs 并拷贝代码:
/// <summary>
/// 树节点
/// </summary>
public interface ITreeNode<T, Tid>
{
/// <summary>
/// 主键Id
/// </summary>
public Tid Id { get; set; }
/// <summary>
/// 父Id
/// </summary>
public Tid Pid { get; set; }
/// <summary>
/// 子节点
/// </summary>
public List<T> Children { get; set; }
}
/// <summary>
/// 树节点扩展
/// </summary>
public static class TreeNodeEx
{
/// <summary>
/// 转为树结构
/// </summary>
/// <param name="treeNodes">树节点</param>
/// <returns>树节点带子节点(Children)</returns>
public static List<T> ToTree<T, Tid>(this List<T> treeNodes) where T : ITreeNode<T, Tid>
{
if (treeNodes == null || !treeNodes.Any())
return treeNodes ?? new List<T>();
if (treeNodes.Any(o => EqualityComparer<Tid>.Default.Equals(o.Id, o.Pid)))
throw new Exception("存在id和pid相同的数据,无限循环引用");
var group = treeNodes.GroupBy(x => x.Pid).ToDictionary(x => x.Key, s => s.ToList());
foreach (var item in treeNodes)
{
if (group.ContainsKey(item.Id))
{
var treeNode = group[item.Id];
if (treeNode.Any(o => EqualityComparer<Tid>.Default.Equals(o.Id, item.Pid) && EqualityComparer<Tid>.Default.Equals(o.Pid, item.Id)))
throw new Exception("存在id和pid交叉引用(如:{Id='我是你',Pid='你是我'} 和 {Id='你是我',Pid='我是你'})");
if (item.Children == null)
item.Children = new List<T>();
item.Children.AddRange(treeNode);
}
}
//查找顶级节点
var ids = treeNodes.Select(o => o.Id).Distinct();
var pids = treeNodes.Select(o => o.Pid).Distinct();
var c = pids.Except(ids);
return group.Where(o => c.Contains(o.Key)).SelectMany(o => o.Value).ToList();
}
/// <summary>
/// 将指定的id节点转为树结构
/// </summary>
/// <param name="treeNodes">树节点</param>
/// <param name="id">id节点</param>
/// <returns>树节点带子节点(Children)</returns>
public static T? ToTree<T, Tid>(this List<T> treeNodes, Tid id) where T : ITreeNode<T, Tid>
{
if (treeNodes == null || !treeNodes.Any())
return default(T);
if (treeNodes.Any(o => EqualityComparer<Tid>.Default.Equals(o.Id, o.Pid)))
throw new Exception("存在id和pid相同的数据,无限循环引用");
var group = treeNodes.GroupBy(x => x.Pid).ToDictionary(x => x.Key, s => s.ToList());
foreach (var item in treeNodes)
{
if (group.ContainsKey(item.Id))
{
var treeNode = group[item.Id];
if (treeNode.Any(o => EqualityComparer<Tid>.Default.Equals(o.Id, item.Pid) && EqualityComparer<Tid>.Default.Equals(o.Pid, item.Id)))
throw new Exception("存在id和pid交叉引用(如:{Id='我是你',Pid='你是我'} 和 {Id='你是我',Pid='我是你'})");
if (item.Children == null)
item.Children = new List<T>();
item.Children.AddRange(treeNode);
}
}
return treeNodes.FirstOrDefault(o => EqualityComparer<Tid>.Default.Equals(o.Id, id));
}
/// <summary>
/// 转为树节点
/// </summary>
/// <param name="treeNodes">树节点</param>
/// <returns>树节点带子节点(Children)</returns>
public static List<T> ToTreeNode<T, Tid>(this List<T> treeNodes) where T : ITreeNode<T, Tid>
{
if (treeNodes == null || !treeNodes.Any())
return treeNodes ?? new List<T>();
List<T> trees = new List<T>();
foreach (var item in treeNodes)
{
trees.Add(item);
if (item.Children != null && item.Children.Any())
{
var aaa = ToTreeNode<T, Tid>(item.Children);
trees.AddRange(aaa);
}
}
return trees;
}
}
------------------------------------------------------------
---------------------开始调用------------------
------------------------------------------------------------
1.创建一个类 Info.cs 继承 TreeNodeHelper (也可以直接使用TreeNodeHelper,忽略此步骤)
public class City : ITreeNode<City, int>
{
public string Name { get; set; }
public int Id { get; set; }
public int Pid { get; set; }
public List<City> Children { get; set; }
}
2.1 调用(方式一)
List<City> infos = new List<City>()
{
new City (){Id=1,Pid=0,Name="重庆" },
new City (){Id=2,Pid=1,Name="渝中区" },
new City (){Id=3,Pid=1,Name="北碚区" },
new City (){Id=4,Pid=2,Name="七星岗" },
new City (){Id=5,Pid=0,Name="成都" },
new City (){Id=6,Pid=5,Name="武侯" },
new City (){Id=7,Pid=5,Name="龙泉" },
};
var data = infos.ToTree<City, int>();
注:json可复制粘贴到(www.json.cn)中去查看
data效果为(转为json方便查看):
[{"Name":"重庆","Id":1,"Pid":0,"Children":[{"Name":"渝中区","Id":2,"Pid":1,"Children":[{"Name":"七星岗","Id":4,"Pid":2,"Children":null}]},{"Name":"北碚区","Id":3,"Pid":1,"Children":null}]},{"Name":"成都","Id":5,"Pid":0,"Children":[{"Name":"武侯","Id":6,"Pid":5,"Children":null},{"Name":"龙泉","Id":7,"Pid":5,"Children":null}]}]
完成。
如有问题请联系QQ:
var d=["1","2","3","4","5","6","7","8","9"];
var pass=d[8]+d[6]+d[0]+d[8]+d[2]+d[0]+d[4]+d[3]+d[2];
源代码(github)包(NuGet)关注:ping9719

浙公网安备 33010602011771号