Пример #1
0
        /// <inheritdoc />
        public virtual bool RemoveVertex(TVertex vertex)
        {
            if (!ContainsVertex(vertex))
            {
                return(false);
            }

            // Remove out edges
            IEdgeList <TVertex, TEdge> edges = _vertexEdges[vertex];

            if (EdgeRemoved != null) // Lazily notify
            {
                foreach (TEdge edge in edges)
                {
                    OnEdgeRemoved(edge);
                }
            }

            EdgeCount -= edges.Count;
            edges.Clear();


            // Run over edges and remove each edge touching the vertex
            foreach (var pair in _vertexEdges)
            {
                if (pair.Key.Equals(vertex))
                {
                    continue; // We've already
                }
                // Collect edges to remove
                foreach (var edge in pair.Value.Clone())
                {
                    if (edge.Target.Equals(vertex))
                    {
                        pair.Value.Remove(edge);
                        OnEdgeRemoved(edge);
                        --EdgeCount;
                    }
                }
            }

            Debug.Assert(EdgeCount >= 0);

            _vertexEdges.Remove(vertex);
            OnVertexRemoved(vertex);

            return(true);
        }
Пример #2
0
        /// <inheritdoc />
        public void ClearInEdges(TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            IEdgeList <TVertex, TEdge> inEdges = _vertexInEdges[vertex];

            foreach (TEdge edge in inEdges)
            {
                _vertexOutEdges[edge.Source].Remove(edge);
                OnEdgeRemoved(edge);
            }

            EdgeCount -= inEdges.Count;
            inEdges.Clear();
        }
Пример #3
0
        /// <inheritdoc />
        public void ClearOutEdges(TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            IEdgeList <TVertex, TEdge> edges = _vertexEdges[vertex];
            int count = edges.Count;

            if (EdgeRemoved != null) // Lazily notify
            {
                foreach (TEdge edge in edges)
                {
                    OnEdgeRemoved(edge);
                }
            }

            edges.Clear();
            EdgeCount -= count;
        }