public static IEnumerable <ReferenceNode> GetReferenceNodesInTree(object graph) { var root = BuildReferenceTree(graph); var comparerNode = new ReferenceEqualsComparer <ReferenceNode>(); var visitedNodes = new HashSet <ReferenceNode>(comparerNode); //var queue = new Queue<ReferenceNode>(); //queue.Enqueue(root); return(GetReferenceNodesInTree(root, visitedNodes)); }
/// <summary> /// UNTESTED!! Use at own risk! Should be used for debugging purposes only. /// </summary> /// <param name="target"></param> /// <param name="graph"></param> /// <returns></returns> public static List <string> SearchObjectInObjectGraph(object target, object graph) { var list = new List <string>(); var root = BuildReferenceTree(graph); var comparerNode = new ReferenceEqualsComparer <ReferenceNode>(); var comparerObj = new ReferenceEqualsComparer <object>(); var visitedNodes = new Dictionary <ReferenceNode, object>(comparerNode); var queue = new Queue <ReferenceNode>(); queue.Enqueue(root); var uniqueFrom = new List <object>(); while (queue.Count > 0) { var activeNode = queue.Dequeue(); foreach (var link in activeNode.Links) { if (!visitedNodes.ContainsKey(link.To)) { queue.Enqueue(link.To); visitedNodes.Add(link.To, null); } if (ReferenceEquals(link.To.Object, target)) { if (!uniqueFrom.Contains(link.From.Object, comparerObj)) { uniqueFrom.Add(link.From.Object); list.Add(link.ToPathString()); } } } } return(list); }