public static ICollection <IList <ITrimmedCurve> > ExtractChains(this ICollection <ITrimmedCurve> curveSegments) { var profiles = new List <List <ITrimmedCurve> >(); var unsortedCurves = new Queue <ITrimmedCurve>(curveSegments); while (unsortedCurves.Count > 0) { var profile = new List <ITrimmedCurve>(); profile.Add(unsortedCurves.Dequeue()); Point chainStart = profile[0].StartPoint; Point chainEnd = profile[0].EndPoint; int counter = unsortedCurves.Count; while (chainStart != chainEnd && counter-- > 0) { ITrimmedCurve candidate = unsortedCurves.Dequeue(); if (candidate.StartPoint == chainEnd) { profile.Add(candidate); chainEnd = candidate.EndPoint; counter = unsortedCurves.Count; continue; } if (candidate.EndPoint == chainEnd) { profile.Add(candidate.GetReverse()); chainEnd = candidate.StartPoint; counter = unsortedCurves.Count; continue; } if (candidate.EndPoint == chainStart) { profile.Insert(0, candidate); chainStart = candidate.StartPoint; counter = unsortedCurves.Count; continue; } if (candidate.StartPoint == chainStart) { profile.Insert(0, candidate.GetReverse()); chainStart = candidate.EndPoint; counter = unsortedCurves.Count; continue; } unsortedCurves.Enqueue(candidate); } if (profile.Count > 0) { profiles.Add(profile); profile = new List <ITrimmedCurve>(); } } return(profiles.Cast <IList <ITrimmedCurve> >().ToArray()); }