You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用递归简化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);
}

说明

  1. 递归方法TryDeleteNode接受父节点和当前节点列表,遍历每个节点:
    • 找到匹配Key的节点时,区分根节点和子节点执行对应删除操作,并返回true终止递归。
    • 未找到则递归遍历当前节点的子节点继续查找。
  2. 使用for循环遍历节点列表,避免foreach遍历中移除元素导致的异常。
  3. 通过isChildNodeDeleted标记判断是否需要更新集合,逻辑更清晰。

内容的提问来源于stack exchange,提问作者CnV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:48:15