public interface ITreeNode { Guid Id { get; } Guid? ParentId { get; } } public class TreeSorter { public static IEnumerable<T> Sort<T>(IEnumerable<T> allNodes) where T: ITreeNode { var sortedNodes = new List<T>(); var visited = new HashSet<Guid>(); foreach (var node in allNodes) Visit(allNodes, node, visited, ref sortedNodes); return sortedNodes; } private static void Visit<T>(IEnumerable<T> allNodes, T node, HashSet<Guid> visited, ref List<T> sortedNodes) where T : ITreeNode { if (visited.Contains(node.Id)) return; visited.Add(node.Id); var parentNode = allNodes.FirstOrDefault(n => n.Id == node.ParentId); if (parentNode != null) Visit(allNodes, parentNode, visited, ref sortedNodes); sortedNodes.Add(node); } }
787900cookie-checkC# Tree sorting for inserting rows in the correct order