Exemple #1
0
        private static void FindLoopsForNode(IndicatorPathNode nodeA,
                                             IndicatorPathNode nodeCur,
                                             StringBuilder path,
                                             List <string> loops,
                                             IndicatorPathNode[] nodes)
        {
            if (nodeCur.indicator.SeriesSources == null)
            {
                return;
            }
            foreach (var src in nodeCur.indicator.SeriesSources)
            {
                var srcSeries = src;
                // найти индикатор, которому принадлежит серия
                var seriesOwner = nodes.FirstOrDefault(n => n.indicator.SeriesResult.Contains(srcSeries));
                if (seriesOwner == null)
                {
                    continue;
                }

                // найдена петля
                if (seriesOwner == nodeA)
                {
                    path.AppendFormat("->[{0}]", nodeA.order);
                    loops.Add(path.ToString());
                    continue;
                }

                if (!seriesOwner.visited)
                {
                    var pathInside = new StringBuilder(path.ToString());
                    pathInside.AppendFormat("->[{0}]", seriesOwner.order);
                    // рекурсия
                    FindLoopsForNode(nodeA, seriesOwner, pathInside, loops, nodes);
                }
                if (nodeCur != nodeA)
                {
                    nodeCur.visited = true;
                }
            }
        }
        private static void FindLoopsForNode(IndicatorPathNode nodeA,
            IndicatorPathNode nodeCur,
            StringBuilder path,
            List<string> loops,
            IndicatorPathNode[] nodes)
        {
            if (nodeCur.indicator.SeriesSources == null) return;
            foreach (var src in nodeCur.indicator.SeriesSources)
            {
                var srcSeries = src;
                // найти индикатор, которому принадлежит серия
                var seriesOwner = nodes.FirstOrDefault(n => n.indicator.SeriesResult.Contains(srcSeries));
                if (seriesOwner == null) continue;

                // найдена петля
                if (seriesOwner == nodeA)
                {
                    path.AppendFormat("->[{0}]", nodeA.order);
                    loops.Add(path.ToString());
                    continue;
                }

                if (!seriesOwner.visited)
                {
                    var pathInside = new StringBuilder(path.ToString());
                    pathInside.AppendFormat("->[{0}]", seriesOwner.order);
                    // рекурсия
                    FindLoopsForNode(nodeA, seriesOwner, pathInside, loops, nodes);
                }
                if (nodeCur != nodeA) nodeCur.visited = true;
            }
        }