linq - 递归地从树中删除项目

标签 linq recursion

我有一个具有以下结构的 TreeView :

var myTree = myRepository.GetTree();

对象 Folder 的结构是这样的:

public class Folder
{
   public string Name { get; set; }
   public List<Folder> Folders { get; set; }
   public Folder Parent { get; set; }
}

假设一个存储库返回给我类似这样的结构:

MyFolder
   -MyChild01
   -MyChild02
      -MySubChild01       
   -MyChild03
      -MySubChild02

我需要递归读取树中的所有项目,如果该项目的名称包含“02”,我必须从树中删除该项目。所以最后的结果应该是:

MyFolder
   -MyChild01
   -MyChild03

我想看看如何使用带有匿名委托(delegate)或递归函数的递归 LINQ 来做到这一点。

最佳答案

您可以采用多种方法来做到这一点。

最简单的做法是采用函数式方法并以递归方式重建树,排除与您的模式匹配的文件夹。

static Folder Filtered(Folder root, Func<Folder, bool> predicate)
{
    return new Folder
    {
        Name = root.Name,
        Parent = root.Parent,
        Folders = root.Folders
            .Where(predicate)
            .Select(subFolder => Filtered(subFolder, predicate))
            .ToList(),
    };
}

Folder myTree = ...;
var filtered = Filtered(myTree, f => f.Name.Contains("02"));

如果出于某种原因您不想创建文件夹的新实例,而是宁愿修改现有实例,则必须进行一些调整,但仍然同样简单。

static Folder Filtered(Folder root, Func<Folder, bool> predicate)
{
    // make use of the RemoveAll() method for lists
    root.Folders.RemoveAll(subFolder => !predicate(subFolder));
    foreach (var subFolder in root.Folders)
    {
        Filtered(subFolder, predicate);
    }
    return root;
}

关于linq - 递归地从树中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7744273/

相关文章:

c# - LINQ 向 WHERE 子句添加额外的逻辑

c# - 在 LINQ 中使用条件

C++ 递归打印二叉树的问题

python - 递归分数(python)

c# - 递归算法后变量神秘地不断变化

c# - 带有点符号的 Linq - 哪种形式更好或者这两者之间有什么区别?

c# - 根据日期对列表进行分组,每个项目有多个日期

python - 在 python 中使用字典进行动态绑定(bind)?

c# - 获取日期之间最畅销的 10 种产品

c - 无限递归 : binary search & asserts