Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从列表中查找(并删除)嵌套对象_C#_Wpf_Linq - Fatal编程技术网

C# 如何从列表中查找(并删除)嵌套对象

C# 如何从列表中查找(并删除)嵌套对象,c#,wpf,linq,C#,Wpf,Linq,希望有人能帮忙。我有一个目标: public class folder { public string folderName { get; set; } public string folderPath { get; set; } public List<folder> subFolders { get; set; } } 似乎无法找到嵌套对象以将其删除 我尝试了几种使用Linq的方法,但没有乐趣,也许他们的方法更好 希望有人能帮忙 谢谢 Nath列表不知道

希望有人能帮忙。我有一个目标:

public class folder
{
    public string folderName { get; set; }
    public string folderPath { get; set; }
    public List<folder> subFolders { get; set; }
}
似乎无法找到嵌套对象以将其删除

我尝试了几种使用Linq的方法,但没有乐趣,也许他们的方法更好

希望有人能帮忙

谢谢


Nath

列表不知道它是递归的。它不知道,也不可能知道它的项具有什么属性,或者它们的含义。
mycustomlist
中的文件夹是
mycustomlist
中的文件夹,还是属于
mycustomlist
中的项目的列表(或子项的子项等)

如果希望一个函数从创建的树结构中的任何位置删除给定项,而不管它位于哪个特定根或子列表中,则必须编写自己的递归方法来执行此操作

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

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

如果文件夹位于子列表中,则需要递归搜索该文件夹,然后将其从实际所在的列表中删除

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
}

这就是我为这个得到的

    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);
                }

            }
        }
    }
public void RemoveFolder(文件夹文件夹,列表文件夹列表)
{
if(folderList!=null)
{
if(folderList.Contains(文件夹))
{
文件夹列表。删除(文件夹);
}
其他的
{
foreach(文件夹列表中的var子文件夹。选择(x=>x.subFolders))
{
移除文件夹(文件夹,子文件夹);
}
}
}
}
但我认为你需要编写自己的权益比较程序

看这里

列表不知道它是递归的。它不知道,也不可能知道它的项具有什么属性,或者它们的含义。
mycustomlist
中的文件夹是
mycustomlist
中的文件夹,还是属于
mycustomlist
中的项目的列表(或子项的子项等)?如果要从已创建的树结构中的任何位置删除项,则必须编写自己的递归方法。为什么需要查找一些嵌套对象?您的列表应包含顶级文件夹。找到包含列表的对象,该列表包含要删除的
文件夹
对象,然后从该点删除。。。不是从最高层…@EdPlunkett谢谢,是的,孩子的后代存在于一个孩子的孩子身上。我希望它足够聪明,但我想我最好写一个递归方法!感谢您的帮助:)将其父对象声明为属性,以便您可以将其从父对象中删除
thefolder.Parent.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
}
    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);
                }

            }
        }
    }