123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- namespace SAGA.DotNetUtils.Data
- {
- /// <summary>
- /// 基础节点元素
- /// </summary>
- public class EAElement<T> where T : EAElement<T>
- {
- public EAElement()
- {
- Children = new EAElementCollection<T>(this as T);
- }
- /// <summary>
- /// 节点Id
- /// </summary>
- public string Id { get; internal set; }
- /// <summary>
- /// 节点名称
- /// </summary>
- public string Name { get; set; }
- /// <summary>
- /// 关联相关元素
- /// </summary>
- public object Tag { get; set; }
- #region 父子关联元素处理
- public EAElementCollection<T> Children { get; private set; }
- public T Parent { get; internal set; }
- #endregion
- #region 公开方法
- /// <summary>
- /// 获取根节点
- /// </summary>
- /// <returns></returns>
- public T GetRoot()
- {
- T root = this as T;
- if (root == null)
- return root;
- while ((root.Parent) != null)
- {
- root = root.Parent;
- }
- return root;
- }
- /// <summary>
- /// 节点深度
- /// </summary>
- public int Deep
- {
- get
- {
- int deep = 1;
- T root = this as T;
- if (root == null)
- return deep;
- while ((root.Parent) != null)
- {
- root = root.Parent;
- deep++;
- }
- return deep;
- }
- }
- /// <summary>
- /// 获取所有的叶子节点
- /// </summary>
- /// <returns></returns>
- public List<T> GetLeaves()
- {
- List<T> result = new List<T>();
- Queue<T> queue = new Queue<T>();
- queue.Enqueue(this as T);
- while (queue.Any())
- {
- var current = queue.Dequeue();
- if (current != null)
- {
- if (current.Children.Count == 0)
- {
- result.Add(current);
- }
- else
- {
- current.Children.ToList().ForEach(c => queue.Enqueue(c));
- }
- }
- }
- return result;
- }
- #endregion
- /// <summary>
- /// 有效的Id
- /// </summary>
- public bool ValidId
- {
- get { return !string.IsNullOrWhiteSpace(Id); }
- }
- /// <summary>
- /// 两个对象是否匹配
- /// </summary>
- /// <param name="ea"></param>
- /// <returns></returns>
- public virtual bool IsMatch(EAElement<T> ea)
- {
- if (ea == null || !ValidId)
- {
- return false;
- }
- return Id == ea.Id || this.Equals(ea);
- }
- #region 扩展数据相关
- protected Dictionary<string, object> m_DicRef = new Dictionary<string, object>();
- /// <summary>
- /// 注册关联值
- /// </summary>
- public void Set<V>(string key, V refObject)
- {
- m_DicRef[key] = refObject;
- }
- /// <summary>
- /// 获取关联对象
- /// </summary>
- /// <typeparam name="V"></typeparam>
- /// <param name="key"></param>
- /// <returns></returns>
- public V Get<V>(string key)
- {
- if (!m_DicRef.ContainsKey(key))
- return default(V);
- return (V) m_DicRef[key];
- }
- #endregion
- }
- #region 节点集合类
- /// <summary>
- /// 节点子项目集合类
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class EAElementCollection<T> : ObservableCollection<T> where T : EAElement<T>
- {
- private T m_Parent;
- internal EAElementCollection(T parent)
- {
- m_Parent = parent;
- }
- protected override void ClearItems()
- {
- foreach (var item in this)
- {
- if (item != null)
- {
- item.Parent = null;
- }
- }
- base.ClearItems();
- }
- protected override void InsertItem(int index, T item)
- {
- base.InsertItem(index, item);
- item.Parent = m_Parent;
- }
- protected override void RemoveItem(int index)
- {
- if (this[index] != null)
- {
- this[index].Parent = null;
- }
- base.RemoveItem(index);
- }
- protected override void SetItem(int index, T item)
- {
- base.SetItem(index, item);
- item.Parent = m_Parent;
- }
- public void AddRange(IEnumerable<T> items)
- {
- foreach (var item in items)
- {
- this.Add(item);
- }
- }
- public void Reverse()
- {
- var list = this.Items as List<T>;
- list?.Reverse();
- }
- }
- #endregion
- }
|