public static void EnsureHierarchicalSource(ref List <HierarchicalRow> dataSource, int rows, int levels) { if (dataSource == null && !hierarchicalDataSourcesCache.TryGetValue(rows, out dataSource)) { dataSource = new List <HierarchicalRow>(rows); hierarchicalDataSourcesCache.Add(rows, dataSource); } if (dataSource.Count != rows) { dataSource.Clear(); int levelStep = (int)(Math.Log(rows, levels) + 0.5); int levelBegin = 0; int levelEnd = levelStep - 1; int parentLevelBegin = 0; int parentLevelEnd = 0; for (int i = 0; i < rows; i++) { if (i == levelEnd) { parentLevelBegin = levelBegin; parentLevelEnd = levelEnd; levelEnd = levelBegin + (levelEnd - levelBegin) * levelStep; levelBegin = i; } HierarchicalRow parent = null; if (parentLevelBegin >= 0 && parentLevelEnd > 0) { int parentLevelSize = parentLevelEnd - parentLevelBegin; parent = dataSource[parentLevelBegin + (i - levelBegin) % parentLevelSize]; } dataSource.Add(HierarchicalRow.CreateHierarchicalRow(parent, i)); } } }
public static HierarchicalRow CreateHierarchicalRow(HierarchicalRow parent, int seed) { return((HierarchicalRow)CreateRow(seed, () => new HierarchicalRow(parent))); }