public static void sortByDistance() { List <BlockData> result = new List <BlockData>(); xyPoint first = new xyPoint(); double distanceReverse; BlockData tmp; bool allowReverse = !VisuGCode.containsG2G3Command() && !VisuGCode.containsG91Command() && !VisuGCode.containsTangential(); while (listFigures.Count > 0) { for (int i = 0; i < listFigures.Count; i++) { tmp = listFigures[i]; tmp.distance = first.DistanceTo(tmp.posStart); distanceReverse = first.DistanceTo(tmp.posEnd); if (allowReverse && (distanceReverse < tmp.distance)) { tmp.distance = distanceReverse; tmp.reverse = true; } listFigures[i] = tmp; } listFigures.Sort((x, y) => x.distance.CompareTo(y.distance)); result.Add(listFigures[0]); first = listFigures[0].posEnd; listFigures.RemoveAt(0); } listFigures.Clear(); foreach (BlockData item in result) { listFigures.Add(item); } }