Пример #1
0
        /// <inheritdoc />
        public int RemoveOutEdgeIf(TVertex vertex, EdgePredicate <TVertex, TEdge> predicate)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }
            if (predicate is null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }

            IEdgeList <TVertex, TEdge> edges = _vertexEdges[vertex];
            var edgesToRemove = new EdgeList <TVertex, TEdge>(edges.Count);

            edgesToRemove.AddRange(edges.Where(edge => predicate(edge)));

            foreach (TEdge edge in edgesToRemove)
            {
                edges.Remove(edge);
                OnEdgeRemoved(edge);
            }

            EdgeCount -= edgesToRemove.Count;

            return(edgesToRemove.Count);
        }
Пример #2
0
        /// <summary>
        /// Removes the given <paramref name="vertex"/> and merges all its connection to other vertices.
        /// </summary>
        /// <param name="vertex">The vertex.</param>
        /// <param name="edgeFactory">Factory method to create an edge.</param>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="vertex"/> is <see langword="null"/>.</exception>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="edgeFactory"/> is <see langword="null"/>.</exception>
        /// <exception cref="VertexNotFoundException"><paramref name="vertex"/> is not part of the graph.</exception>
        public void MergeVertex(
            [NotNull] TVertex vertex,
            [NotNull, InstantHandle] EdgeFactory<TVertex, TEdge> edgeFactory)
        {
            if (vertex == null)
                throw new ArgumentNullException(nameof(vertex));
            if (edgeFactory is null)
                throw new ArgumentNullException(nameof(edgeFactory));

            // Storing edges (not a copy)
            // Remove vertex will delete some of these edges
            // but it will remain needed edges to perform the merge
            if (!_vertexInEdges.TryGetValue(vertex, out IEdgeList<TVertex, TEdge> inEdges))
                throw new VertexNotFoundException();
            IEdgeList<TVertex, TEdge> outEdges = _vertexOutEdges[vertex];

            // Remove vertex
            RemoveVertex(vertex);

            // Add edges from each source to each target
            foreach (TVertex source in inEdges.Select(source => source.Source))
            {
                IEnumerable<TVertex> targets = outEdges
                    .Where(target => !EqualityComparer<TVertex>.Default.Equals(vertex, target.Target))
                    .Select(target => target.Target);
                foreach (TVertex target in targets)
                {
                    // We add an new edge
                    AddEdgeInternal(edgeFactory(source, target));
                }
            }
        }
Пример #3
0
        /// <inheritdoc />
        public int RemoveAdjacentEdgeIf(TVertex vertex, EdgePredicate <TVertex, TEdge> predicate)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            IEdgeList <TVertex, TEdge> outEdges = _adjacentEdges[vertex];
            var edges = new List <TEdge>(outEdges.Count);

            edges.AddRange(
                outEdges.Where(edge => predicate(edge)));

            RemoveEdges(edges);
            return(edges.Count);
        }