static TreeIndexOption() { //最大可以到 999. var numbers = new string[999]; for (int i = 1; i <= 999; i++) { numbers[i - 1] = i.ToString("d3"); } var value = new TreeIndexOption { Seperator = '.', Layers = new string[][] { numbers } }; //public static readonly TreeIndexOption Default = new TreeIndexOption //{ // Seperator = '.', // Layers = new string[][] { // new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" } // } //}; Default = value; }
/// <summary> /// 以树节点加载算法加载数据。 /// </summary> /// <param name="list">The list.</param> /// <param name="nodes">The nodes.</param> /// <param name="indexOption">The index option.</param> internal static void LoadTreeData(IList<Entity> list, IEnumerable nodes, TreeIndexOption indexOption) { /*********************** 代码块解释 ********************************* * 树节点加载算法: * 由于树节点在查询时已经通过 TreeIndex 来排序了,本质上是一种树的深度遍历序。 * 所以我们只需要记录最后一次添加的节点,然后通过它尝试找到与要添加的节点的父节点, * 如果没有找到,则直接把要添加的节点添加到列表中。 * 这样,就以一种顺序的方式完成了整个节点的加载。 **********************************************************************/ //最后一次添加的节点。 Entity lastNode = null; foreach (Entity entity in nodes) { var treePId = entity.TreePId; if (treePId == null) { var added = TryAddToList(list, entity, indexOption); if (added) lastNode = entity; } else { //尝试通过最后一次添加的节点来找到与 entity 关联的父节点。 var parentNode = lastNode; while (parentNode != null && !treePId.Equals(parentNode.Id)) { parentNode = parentNode.TreeParentData; } //如果没有找到 parentNode,则加入到列表中。否则,加入到 parentNode 下。 if (parentNode == null) { var added = TryAddToList(list, entity, indexOption); if (added) lastNode = entity; } else { parentNode.TreeChildren.LoadAdd(entity); lastNode = entity; } } } }
/// <summary> /// 必须要同一级的节点才能加入到实体列表中。 /// Test:TET_Query_LoadSubTreeIgnoreOtherNodes /// </summary> /// <param name="list"></param> /// <param name="node"></param> /// <param name="indexOption"></param> private static bool TryAddToList(IList<Entity> list, Entity node, TreeIndexOption indexOption) { if (list.Count > 0) { var listLevel = indexOption.CountLevel(list[0].TreeIndex); var nodeLevel = indexOption.CountLevel(node.TreeIndex); if (listLevel == nodeLevel) { list.Add(node); return true; } } else { list.Add(node); return true; } return false; }