public static void GetSubcriptionList(string targetLocation, List <Subscription> result, Stack <string> currTargetStack, Dictionary <string, SubcriptionGraphItem> lookupDictionary) { if (currTargetStack.Contains(targetLocation)) { bool circular = true; } string currKey = targetLocation; string previousReferrerKey = null; if (currTargetStack.Count > 0) { previousReferrerKey = currTargetStack.Peek(); } currTargetStack.Push(targetLocation); List <Subscription> thisLevelCombined = new List <Subscription>(); if (lookupDictionary.ContainsKey(targetLocation) == false) { SubcriptionGraphItem graphItem = new SubcriptionGraphItem() { Key = currKey, }; if (previousReferrerKey != null) { graphItem.Targets.Add(lookupDictionary[previousReferrerKey]); } lookupDictionary.Add(currKey, graphItem); SubscriptionCollection subscriptionCollection = GetSubscriptions(targetLocation); string targetParentLocation = GetParentDirectoryTarget(targetLocation); SubscriptionCollection parentSubscriptionCollection = GetSubscriptions(targetParentLocation); if (subscriptionCollection == null && parentSubscriptionCollection == null) { return; } if (subscriptionCollection != null) { thisLevelCombined.AddRange(subscriptionCollection.CollectionContent); } if (parentSubscriptionCollection != null) { thisLevelCombined.AddRange(parentSubscriptionCollection.CollectionContent); } graphItem.SubscribersList = thisLevelCombined; } else { SubcriptionGraphItem graphItem = lookupDictionary[targetLocation]; if (previousReferrerKey != null) { graphItem.AddTargetIfMissing(targetKey: previousReferrerKey, dictionary: lookupDictionary); } thisLevelCombined = graphItem.SubscribersList; //thisLevelCombined = lookupDictionary[targetLocation]; } if (thisLevelCombined == null || thisLevelCombined.Count == 0) { return; } result.AddRange(thisLevelCombined); foreach (var subscription in thisLevelCombined) { //List<string> independentTargetStack = new List<string>(currTargetStack); Stack <string> independentTargetStack = new Stack <string>(currTargetStack.Reverse()); GetSubcriptionList(subscription.SubscriberRelativeLocation, result, independentTargetStack, lookupDictionary); } int distinctCount = result.Select(sub => sub.SubscriberRelativeLocation).Distinct().Count(); Debug.WriteLine("Count: " + result.Count + " Distinctive: " + distinctCount); }
public static void GetSubcriptionList(string targetLocation, List<Subscription> result, Stack<string> currTargetStack, Dictionary<string, SubcriptionGraphItem> lookupDictionary) { if(currTargetStack.Contains(targetLocation)) { bool circular = true; } string currKey = targetLocation; string previousReferrerKey = null; if (currTargetStack.Count > 0) previousReferrerKey = currTargetStack.Peek(); currTargetStack.Push(targetLocation); List<Subscription> thisLevelCombined = new List<Subscription>(); if (lookupDictionary.ContainsKey(targetLocation) == false) { SubcriptionGraphItem graphItem = new SubcriptionGraphItem() { Key = currKey, }; if(previousReferrerKey != null) graphItem.Targets.Add(lookupDictionary[previousReferrerKey]); lookupDictionary.Add(currKey, graphItem); SubscriptionCollection subscriptionCollection = GetSubscriptions(targetLocation); string targetParentLocation = GetParentDirectoryTarget(targetLocation); SubscriptionCollection parentSubscriptionCollection = GetSubscriptions(targetParentLocation); if (subscriptionCollection == null && parentSubscriptionCollection == null) { return; } if (subscriptionCollection != null) { thisLevelCombined.AddRange(subscriptionCollection.CollectionContent); } if (parentSubscriptionCollection != null) { thisLevelCombined.AddRange(parentSubscriptionCollection.CollectionContent); } graphItem.SubscribersList = thisLevelCombined; } else { SubcriptionGraphItem graphItem = lookupDictionary[targetLocation]; if(previousReferrerKey != null) graphItem.AddTargetIfMissing(targetKey:previousReferrerKey, dictionary:lookupDictionary); thisLevelCombined = graphItem.SubscribersList; //thisLevelCombined = lookupDictionary[targetLocation]; } if (thisLevelCombined == null || thisLevelCombined.Count == 0) return; result.AddRange(thisLevelCombined); foreach(var subscription in thisLevelCombined) { //List<string> independentTargetStack = new List<string>(currTargetStack); Stack<string> independentTargetStack = new Stack<string>(currTargetStack.Reverse()); GetSubcriptionList(subscription.SubscriberRelativeLocation, result, independentTargetStack, lookupDictionary); } int distinctCount = result.Select(sub => sub.SubscriberRelativeLocation).Distinct().Count(); Debug.WriteLine("Count: " + result.Count + " Distinctive: " + distinctCount); }