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