public static void MergeGroup(SolvingNode[] cycleRoute) { var main = cycleRoute.First(); foreach (var current in cycleRoute) { if (current == main) { continue; } if (current.State is RefTo refState) { if (!cycleRoute.Contains(refState.Node)) { throw new InvalidOperationException(); } } else { //merge main and current main.State = GetMergedState(main.State, current.State); } main.Ancestors.AddRange(current.Ancestors); current.Ancestors.Clear(); if (!current.IsSolved) { current.State = new RefTo(main); } } var newAncestors = main.Ancestors.Distinct() .SelectMany(r => r.Ancestors) .Where(r => !cycleRoute.Contains(r)) .Distinct() .ToList(); main.Ancestors.Clear(); main.Ancestors.AddRange(newAncestors); }