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