using System.Collections.Generic;
namespace SolutionCleanupTool.Models
{
///
/// Represents a dependency graph of projects within a solution
///
public class DependencyGraph
{
public Dictionary> Dependencies { get; set; } = new Dictionary>();
public List Nodes { get; set; } = new List();
///
/// Adds a dependency relationship between two projects
///
public void AddDependency(string fromProject, string toProject)
{
if (!Dependencies.ContainsKey(fromProject))
{
Dependencies[fromProject] = new List();
}
if (!Dependencies[fromProject].Contains(toProject))
{
Dependencies[fromProject].Add(toProject);
}
}
///
/// Checks if the dependency graph has circular references
///
public bool HasCircularReferences()
{
var visited = new HashSet();
var recursionStack = new HashSet();
foreach (var node in Dependencies.Keys)
{
if (HasCircularReferencesUtil(node, visited, recursionStack))
{
return true;
}
}
return false;
}
private bool HasCircularReferencesUtil(string node, HashSet visited, HashSet recursionStack)
{
if (recursionStack.Contains(node))
{
return true;
}
if (visited.Contains(node))
{
return false;
}
visited.Add(node);
recursionStack.Add(node);
if (Dependencies.ContainsKey(node))
{
foreach (var neighbor in Dependencies[node])
{
if (HasCircularReferencesUtil(neighbor, visited, recursionStack))
{
return true;
}
}
}
recursionStack.Remove(node);
return false;
}
}
}