我有一个具有以下结构的树视图:
var myTree = myRepository.GetTree();
Run Code Online (Sandbox Code Playgroud)
以这种方式构造对象文件夹的位置:
public class Folder
{
public string Name { get; set; }
public List<Folder> Folders { get; set; }
public Folder Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
假设存储库正在向我返回类似这样的结构:
MyFolder
-MyChild01
-MyChild02
-MySubChild01
-MyChild03
-MySubChild02
Run Code Online (Sandbox Code Playgroud)
我需要以递归方式读取树中的所有项目,如果项目的名称包含"02",我必须从树中删除该项.所以最终的结果应该是:
MyFolder
-MyChild01
-MyChild03
Run Code Online (Sandbox Code Playgroud)
我想看看如何使用带有匿名委托的递归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"));
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因您不想创建文件夹的新实例但宁愿修改现有实例,则必须进行一些调整但仍然同样简单.
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;
}
Run Code Online (Sandbox Code Playgroud)