예제 #1
0
        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);
        }
예제 #2
0
 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);
 }