/// <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); }
/// <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)); } } }
/// <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); }