如何从List中查找(和删除)嵌套对象

时间:2016-02-12 13:53:29

标签: c# wpf linq

希望有人可以提供帮助。我有一个对象:

public class folder
{
    public string folderName { get; set; }
    public string folderPath { get; set; }
    public List<folder> subFolders { get; set; }
}

你可以看到该对象包含一个引用自身的对象,允许我建立一个文件夹和子文件夹列表,然后我有一个

List<folder> mycustomlist ect..

将其存储在。此列表可以非常深,并且在绑定到树视图或自定义列表视图时工作正常。

我的问题是尝试从List中删除嵌套文件夹,我可以使用

获取对象
mycustomlist.Remove(thefolder) 

似乎无法找到嵌套对象以将其删除。

我已经尝试过使用Linq的几种方法,但没有快乐,也许他们是更好的方法吗?

希望有人能提供帮助,

由于

纳特

3 个答案:

答案 0 :(得分:3)

  

似乎无法找到嵌套对象以将其删除。

Remove不是递归的。它只会直接删除列表中的项目。

如果thefolder位于子列表中,那么您需要递归搜索该列表,然后将其从实际所在的列表中删除。

private bool RecursiveRemove(folder thisList, folder thefolder)
{
    if (thisList.Contains(theFolder))
    {
        thisList.Remove(theFolder);
        return true;
    }
    else
    {
        foreach (var folder in thisList.subFolders)
        {
            if (RecursiveRemove(folder, theFolder))
            {
                return true;
            }
        }
    }

    return false;  // not found
}

答案 1 :(得分:0)

列表不知道它是递归的。它不会,也不会知道它的项目具有什么属性,或者它们的含义。是theFolder中的mycustomlist,还是属于mycustomlist中的项目(或孩子的孩子等)的列表中的// javascript $(function() { renderSelect("select"); }); # HAML example (Rails) = select_tag "countries", options_for_select(@countries), class: 'some-ignored-css-class'

如果你想要一个函数从你创建的这个树结构中的任何地方中删除一个给定的项目,无论它存在于哪个特定的根或子列表中,你都必须编写你的自己的递归方法来做到这一点。

答案 2 :(得分:0)

这就是我所拥有的

    public void RemoveFolder(Folder folder, List<Folder> folderList)
    {
        if (folderList != null)
        {
            if (folderList.Contains(folder))
            {
                folderList.Remove(folder);
            }
            else
            {
                foreach (var subFolder in folderList.Select(x => x.subFolders))
                {
                    RemoveFolder(folder, subFolder);
                }

            }
        }
    }

但我认为你需要编写自己的资产比较器

见这里 List.Contains is not working as hoped