c# - 使用递归 c# 实现以下方法

标签 c# recursion

<分区>

如何将以下方法更改为递归方法:

    public List<ScanItem> search(List<ScanItem> allItems)
    {
        List<ScanItem> rt = new List<ScanItem>();

        foreach (ScanItem s in allItems)
        {
            if (s.IsDirectory)
            {
                rt.Add(s);



                foreach (ScanItem s1 in ((ScanDir)s).Items)
                {
                    if (s1.IsDirectory)
                    {
                        rt.Add(s1);




                        foreach (ScanItem s2 in ((ScanDir)s1).Items)
                        {
                            if (s2.IsDirectory)
                            {
                                rt.Add(s2);

                                foreach (ScanItem s3 in ((ScanDir)s2).Items)
                                {
                                    if (s3.IsDirectory)
                                    {
                                        rt.Add(s3);

                                        /// repeat until there are no more direcotries

                                    }
                                    else
                                        if (s3.Name.Contains("Foo"))
                                            rt.Add(s3);
                                }

                            }
                            else
                                if (s2.Name.Contains("Foo"))
                                    rt.Add(s2);
                        }



                    }
                    else
                        if (s1.Name.Contains("Foo"))
                            rt.Add(s1);
                }


            }
            else                
                if (s.Name.Contains("Foo"))                    
                    rt.Add(s);                    

        }

        return rt;

    }

让我向您展示我是如何构建它的:

第一步:

    public List<ScanItem> search(List<ScanItem> allItems)
    {
        List<ScanItem> rt = new List<ScanItem>();

        foreach (ScanItem s in allItems)
        {
            if (s.IsDirectory)
            {
                rt.Add(s);

            }
            else                
                if (s.Name.Contains("Foo"))                    
                    rt.Add(s);                    

        }

        return rt;

    }

第二步:

    public List<ScanItem> search(List<ScanItem> allItems)
    {
        List<ScanItem> rt = new List<ScanItem>();

        foreach (ScanItem s in allItems)
        {
            if (s.IsDirectory)
            {
                rt.Add(s);



                foreach (ScanItem s1 in ((ScanDir)s).Items)
                {
                    if (s1.IsDirectory)
                    {
                        rt.Add(s1);

                    }
                    else
                        if (s1.Name.Contains("Foo"))
                            rt.Add(s1);
                }


            }
            else                
                if (s.Name.Contains("Foo"))                    
                    rt.Add(s);                    

        }

        return rt;

    }

第 3 步:

    public List<ScanItem> search(List<ScanItem> allItems)
    {
        List<ScanItem> rt = new List<ScanItem>();

        foreach (ScanItem s in allItems)
        {
            if (s.IsDirectory)
            {
                rt.Add(s);



                foreach (ScanItem s1 in ((ScanDir)s).Items)
                {
                    if (s1.IsDirectory)
                    {
                        rt.Add(s1);




                        foreach (ScanItem s2 in ((ScanDir)s1).Items)
                        {
                            if (s2.IsDirectory)
                            {
                                rt.Add(s2);

                            }
                            else
                                if (s2.Name.Contains("Foo"))
                                    rt.Add(s2);
                        }



                    }
                    else
                        if (s1.Name.Contains("Foo"))
                            rt.Add(s1);
                }


            }
            else                
                if (s.Name.Contains("Foo"))                    
                    rt.Add(s);                    

        }

        return rt;

    }

第 4 步:

    public List<ScanItem> search(List<ScanItem> allItems)
    {
        List<ScanItem> rt = new List<ScanItem>();

        foreach (ScanItem s in allItems)
        {
            if (s.IsDirectory)
            {
                rt.Add(s);



                foreach (ScanItem s1 in ((ScanDir)s).Items)
                {
                    if (s1.IsDirectory)
                    {
                        rt.Add(s1);




                        foreach (ScanItem s2 in ((ScanDir)s1).Items)
                        {
                            if (s2.IsDirectory)
                            {
                                rt.Add(s2);

                                foreach (ScanItem s3 in ((ScanDir)s2).Items)
                                {
                                    if (s3.IsDirectory)
                                    {
                                        rt.Add(s3);

                                    }
                                    else
                                        if (s3.Name.Contains("Foo"))
                                            rt.Add(s3);
                                }

                            }
                            else
                                if (s2.Name.Contains("Foo"))
                                    rt.Add(s2);
                        }



                    }
                    else
                        if (s1.Name.Contains("Foo"))
                            rt.Add(s1);
                }


            }
            else                
                if (s.Name.Contains("Foo"))                    
                    rt.Add(s);                    

        }

        return rt;

    }

请注意,我一直在复制:

                                foreach (ScanItem s3 in ((ScanDir)s2).Items)
                                {
                                    if (s3.IsDirectory)
                                    {
                                        rt.Add(s3);

                                        /// repeat until there are no more direcotries

                                    }
                                    else
                                        if (s3.Name.Contains("Foo"))
                                            rt.Add(s3);
                                }

最佳答案

private void SearchCore(IEnumerable<ScanItem> items, List<ScanItem> foundItems)
{
    foreach (ScanItem s in items)
    {
        if (s.IsDirectory)
        {
            foundItems.Add(s);
            searchCore (((ScanDir)s2).Items, foundItems);
        }
        else if (s.Name.Contains("Foo"))                    
                foundItems.Add(s);
    }
}

public List<ScanItem> Search(List<ScanItem> allItems)
{
    List<ScanItem> foundItems = new List<ScanItem>();
    searchCore (allItems, foundItems);
    return foundItems;
}

关于c# - 使用递归 c# 实现以下方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587207/

相关文章:

c# - .NET 货币格式化程序 : can I specify the use of banker's rounding?

java - 查找二叉搜索树中的第 n 个节点

c++ - 使显式堆栈算法更快

python-3.x - 给定一个节点,烧毁整个二叉树需要多长时间?

c - C 中的类二叉树 - 递归

c# - 使用动态参数的方法重载决议

c# - ASP.NET - 我存储在缓存中的所有内容都是 w3wp 进程的一部分吗?

c# - 恢复数据库时提取 Zip 文件

c# - 从子进程的标准输出同步异步读取

c++ - 使用 C++ 的递归线程使资源暂时不可用