如何用递归简化LiteCollection中多级目录的删除函数?
问题描述
我有一个存储在LiteCollection中的文件夹列表,想要实现一个允许用户删除任意层级文件夹的删除函数。我测试了下面的删除函数,它能正常运行,但我希望简化代码,实现无层级限制的深度搜索,而不是依赖多层foreach循环。请问如何用递归简化该函数?
PrinterDirectory 类
public class PrinterDirectory { public PrinterDirectory() { Children = new List<PrinterDirectory>(); } public int Id { get; set; } public string Key { get; set; } public string Title { get; set; } public List<PrinterDirectory> Children { get; set; } }
原有删除函数
LiteCollection<PrinterDirectory> _printerDirectoryCollection; List<PrinterDirectory> mainDirList = new List<PrinterDirectory>(); mainDirList = _printerDirectoryCollection.FindAll().ToList(); var stat = ""; var key = "2-0-0"; foreach (PrinterDirectory _printerDir in mainDirList) { if (_printerDir.Key.Equals(key)) { _printerDirectoryCollection.Delete(dir => dir.Key.Equals(key)); break; } if(_printerDir.Children.Count != 0) { foreach(PrinterDirectory _printerDir2 in _printerDir.Children) { if(_printerDir2.Key.Equals(key)) { if(_printerDir.Children.Remove(_printerDir2)) { stat = "childnode"; break; } } if(_printerDir2.Children.Count != 0) { foreach(PrinterDirectory _printerDir3 in _printerDir2.Children) { if (_printerDir3.Key.Equals(key)) { if (_printerDir2.Children.Remove(_printerDir3)) { stat = "childnode"; break; } } if (_printerDir3.Children.Count != 0) { foreach (PrinterDirectory _printerDir4 in _printerDir3.Children) { if (_printerDir4.Key.Equals(key)) { if (_printerDir3.Children.Remove(_printerDir4)) { stat = "childnode"; break; } } } } } } } } } if(stat == "childnode") _printerDirectoryCollection.Update(printerDirList);
递归优化方案
可以编写一个递归辅助方法,遍历所有层级的节点,找到匹配Key的节点后从其父节点的子列表中移除,或者直接删除根节点。这样不管层级多深都能处理,无需嵌套foreach循环。
实现代码
LiteCollection<PrinterDirectory> _printerDirectoryCollection; var key = "2-0-0"; var mainDirList = _printerDirectoryCollection.FindAll().ToList(); bool isChildNodeDeleted = false; // 递归查找并删除节点 bool TryDeleteNode(PrinterDirectory parent, List<PrinterDirectory> currentNodes) { for (int i = 0; i < currentNodes.Count; i++) { var node = currentNodes[i]; if (node.Key.Equals(key)) { // 根节点直接从集合删除 if (parent == null) { _printerDirectoryCollection.Delete(dir => dir.Key.Equals(key)); } // 子节点从父节点的子列表移除 else { currentNodes.RemoveAt(i); isChildNodeDeleted = true; } return true; } // 递归遍历当前节点的子节点 if (node.Children.Count > 0 && TryDeleteNode(node, node.Children)) { return true; } } return false; } // 启动递归处理根节点列表 TryDeleteNode(null, mainDirList); // 删除子节点后更新集合 if (isChildNodeDeleted) { _printerDirectoryCollection.Update(mainDirList); }
说明
- 递归方法
TryDeleteNode接受父节点和当前节点列表,遍历每个节点:- 找到匹配Key的节点时,区分根节点和子节点执行对应删除操作,并返回true终止递归。
- 未找到则递归遍历当前节点的子节点继续查找。
- 使用
for循环遍历节点列表,避免foreach遍历中移除元素导致的异常。 - 通过
isChildNodeDeleted标记判断是否需要更新集合,逻辑更清晰。
内容的提问来源于stack exchange,提问作者CnV
相关产品推荐
相关产品推荐

