123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace SAGA.DotNetUtils.Data
- {
- #region 概述
- /*
- * 有向图,和无向图,部分方法不同;
- *
- * 内部操作使用索引;功能扩展使用Data
- */
- #endregion
- /// <summary>
- /// 边集列表
- /// </summary>
- public class EdgesArray<V,VD,E,ED> : BaseEdgesArray<V, VD, E, ED> where V : EAVertex<VD> where E : EAEdge<ED>
- {
- public EdgesArray()
- {
-
- }
- #region 控制属性
- /// <summary>
- /// 表示该图信息是否是有向的
- /// </summary>
- public bool IsDirection { get; set; }
- #endregion
- #region 编号系统
- private int m_CurrentVertexIndex;
- /// <summary>
- /// 生成节点索引
- /// </summary>
- /// <returns></returns>
- private string GenerateVertexIndex()
- {
- return "V" + (++m_CurrentVertexIndex);
- }
- /// <summary>
- /// 生成节点索引
- /// </summary>
- /// <returns></returns>
- private string GenerateEdgeIndex()
- {
- return "E" + (++m_CurrentVertexIndex);
- }
- #endregion
- #region 点操作
- /// <summary>
- /// 增加顶点
- /// </summary>
- /// <param name="vertex"></param>
- /// <returns></returns>
- public virtual V AddVertex(V vertex)
- {
- if (vertex == null)
- return null;
- V result = vertex;
- var useVertex = FindVertex(vertex);
- if (useVertex == null)
- {
- vertex.Id = GenerateVertexIndex();
- this.m_Vertexes.Add(vertex);
- }
- else
- {
- useVertex.Merge(vertex);
- result = useVertex;
- }
- return result;
- }
- /// <summary>
- /// 根据顶点Id查询相应的节点
- /// </summary>
- /// <param name="vertexId"></param>
- /// <returns></returns>
- public virtual V FindVertex(string vertexId)
- {
- if (string.IsNullOrWhiteSpace(vertexId))
- {
- return null;
- }
- if (this.m_Vertexes.Contains(vertexId))
- {
- return this.m_Vertexes[vertexId];
- }
- return null ;
- }
- /// <summary>
- /// 根据顶点Id查询相应的节点
- /// </summary>
- /// <param name="v">根据顶点信息去检索点</param>
- /// <returns></returns>
- public virtual V FindVertex(V v)
- {
- /*
- * 待改进:id快索引,IsMatch值匹配慢索引
- */
- var useV = FindVertex(v.Id);
- if(useV==null)
- {
- useV= this.Vertexes.FirstOrDefault(c =>c.IsMatch(v));
- }
- return useV;
- }
- /// <summary>
- /// 根据Id移除节点
- /// </summary>
- /// <param name="vertexId"></param>
- /// <returns></returns>
- public virtual bool RemoveVertex(string vertexId)
- {
- var realRemove = this.m_Vertexes.Remove(vertexId);
- if (realRemove)
- {
- //移除节点需要移除相应的边
- }
- return realRemove;
- }
- /// <summary>
- /// 隐藏点
- /// </summary>
- /// <param name="vertexId"></param>
- public virtual void HideVertex(string vertexId)
- {
- }
- /// <summary>
- /// 合并关联的点
- /// </summary>
- /// <param name="vs"></param>
- /// <returns></returns>
- public virtual V CombineVertexes(List<V> vs)
- {
- return null;
- }
- #endregion
- #region 边操作
- public E GetEdge(string edgeId)
- {
- if (this.m_Edges.Contains(edgeId))
- {
- return m_Edges[edgeId];
- }
- return null;
- }
- /// <summary>
- /// 增加边
- /// </summary>
- /// <param name="edge"></param>
- /// <returns></returns>
- public virtual E AddEdge(E edge)
- {
- var start = FindVertex(edge.StartVertex);
- if (start == null)
- throw new Exception("start元素必须在图中");
- var end = FindVertex(edge.EndVertex);
- if (end == null)
- throw new Exception("end元素必须在图中");
- edge.Id = GenerateEdgeIndex();
- this.m_Edges.Add(edge);
- return edge;
- }
- /// <summary>
- /// 增加边信息
- /// </summary>
- /// <param name="start"></param>
- /// <param name="end"></param>
- /// <param name="edge"></param>
- /// <returns></returns>
- public virtual E AddEdge(V start, V end, E edge)
- {
- var startV = AddVertex(start);
- if (startV == null)
- {
- throw new Exception("start不能为null");
- }
- var endV = AddVertex(end);
- if (endV == null)
- {
- throw new Exception("end不能为null");
- }
- edge.StartVertex =startV.Id;
- edge.EndVertex = endV.Id;
- edge.Id = GenerateEdgeIndex();
- this.m_Edges.Add(edge);
- return edge;
- }
- /// <summary>
- /// 移除边信息
- /// </summary>
- /// <param name="edgeId"></param>
- /// <returns></returns>
- public virtual bool RemoveEdge(string edgeId)
- {
- return this.m_Edges.Remove(edgeId); ;
- }
- #endregion
- #region 相关公开方法
- /// <summary>
- /// 获取最后一个状态的边集集合
- /// </summary>
- /// <returns></returns>
- public List<E> GetLastStateEdges()
- {
- var edges=this.Edges.Where(e => e.Parent == null).ToList();
- return edges;
- }
- /// <summary>
- /// 获取原始状态的边集合
- /// </summary>
- /// <returns></returns>
- public List<E> GeFirstStateEdges()
- {
- var edges = this.Edges.Where(e => e.Parent.Children.Count==0).ToList();
- return edges;
- }
- #endregion
- }
- }
|