linq - Recursively remove items from Tree -
i have treeview following structure:
var mytree = myrepository.gettree();
where object folder structured in way:
public class folder { public string name { get; set; } public list<folder> folders { get; set; } public folder parent { get; set; } }
assuming repository returning me structure:
myfolder -mychild01 -mychild02 -mysubchild01 -mychild03 -mysubchild02
i need recursively read items in tree , if item has name containing '02' have remove item tree. final result should be:
myfolder -mychild01 -mychild03
i see how using recursive linq anonymous delegate or recursive function.
there's number of approaches take this.
the easiest thing take functional approach , rebuild tree recursively excluding folders match pattern.
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"));
if whatever reason rather not make new instances of folders rather modify existing instances, adjustments have made still equally simple.
static folder filtered(folder root, func<folder, bool> predicate) { // make use of removeall() method lists root.folders.removeall(subfolder => !predicate(subfolder)); foreach (var subfolder in root.folders) { filtered(subfolder, predicate); } return root; }
Comments
Post a Comment