Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# Foreach内部Foreach内部Foreach_C# - Fatal编程技术网

C# Foreach内部Foreach内部Foreach

C# Foreach内部Foreach内部Foreach,c#,C#,在我的应用程序中,我使用scrape(字符串url)方法从网页中刮取链接。假设它每次都返回10个url 我想刮10个链接,从每一个刮网址 长话短说: (第1步)转到网页并刮取10个链接 (步骤2)对于步骤1中的每个链接,转到网页并刮取10个链接 (第3步)对于第2步中的每个链接,转到该网页并刮取10个链接 所以它会给我10+100+1000个链接=1110 当然我可以这样做: List<string> links1 = new List<string>();

在我的应用程序中,我使用
scrape(字符串url)
方法从网页中刮取链接。假设它每次都返回10个url

我想刮10个链接,从每一个刮网址

长话短说:

(第1步)转到网页并刮取10个链接

(步骤2)对于步骤1中的每个链接,转到网页并刮取10个链接

(第3步)对于第2步中的每个链接,转到该网页并刮取10个链接

所以它会给我10+100+1000个链接=1110

当然我可以这样做:

    List<string> links1 = new List<string>();
    List<string> links2 = new List<string>();
    List<string> links3 = new List<string>();


    links1 = scrape("example.com"); //get 10 links

    foreach (string link in links1)
    {
        List<string> temp = new List<string>();
        temp = scrape(link);
        links2.AddRange(temp);
    } //get 100 links

    foreach (string link in links2)
    {
        List<string> temp = new List<string>();
        temp = scrape(link);
        links3.AddRange(temp);
    } // get 1000 links
List links1=新列表();
List links2=新列表();
List links3=新列表();
links1=scrap(“example.com”)//获取10个链接
foreach(links1中的字符串链接)
{
列表温度=新列表();
温度=刮伤(链路);
links2.AddRange(温度);
}//获取100个链接
foreach(links2中的字符串链接)
{
列表温度=新列表();
温度=刮伤(链路);
链接3.添加范围(温度);
}//获取1000个链接
但这是可怕的编辑。如果我想刮从刮链接10次?我必须为每个循环创建10个
foreach


你能给我一些建议吗?

递归函数是你最好的选择。但是,您需要传递一个参数来跟踪您的“深度”,否则您可能会在整个公共网站上爬行

public List<string> GetLinks(List<string> urls, int depth){
    var newUrls = new List<string>();
    if(depth == 0) return newUrls ;
    foreach(var url in urls){
         newUrls.AddRange(scrape(url));
    }
    return urls.AddRange(GetLinks(newUrls, depth - 1);
}
publicslist-GetLinks(列表URL,int-depth){
var newurl=newlist();
if(depth==0)返回newURL;
foreach(url中的变量url){
AddRange(scrape(url));
}
返回url.AddRange(GetLinks(newurl,depth-1);
}

递归函数是最好的选择。但是,您需要传递一个参数来跟踪您的搜索“有多深”,否则您可能会在整个公共网站上爬行

public List<string> GetLinks(List<string> urls, int depth){
    var newUrls = new List<string>();
    if(depth == 0) return newUrls ;
    foreach(var url in urls){
         newUrls.AddRange(scrape(url));
    }
    return urls.AddRange(GetLinks(newUrls, depth - 1);
}
publicslist-GetLinks(列表URL,int-depth){
var newurl=newlist();
if(depth==0)返回newURL;
foreach(url中的变量url){
AddRange(scrape(url));
}
返回url.AddRange(GetLinks(newurl,depth-1);
}

您需要使用递归

这里的想法是继续调用相同的函数,直到没有子函数为止。递归的一个示例是在treelist函数中的FindTreeNode内部:

TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type, Nullable<long> id)
{
    foreach (var c in node.Nodes) 
    {
        if ((Enumerations.ItemType)c[2] == type &&
           (id == null || (long)c[0] == id.Value)) {

            return c;
        }

        if (c.HasChildren) 
        {
            // Here is the secret sauce
            // This is recursion
            var exists = FindTreeNode(c, type, id);
            if (exists != null) { return exists; }
        }
    }
    return null;
}
TreeListNode FindTreeNode(TreeListNode节点,Enumerations.ItemType类型,可空id)
{
foreach(node.Nodes中的var c)
{
if((Enumerations.ItemType)c[2]==类型&&
(id==null | |(long)c[0]==id.Value)){
返回c;
}
如果(c.有子女)
{
//这是秘方
//这是递归
var exists=FindTreeNode(c,type,id);
如果(exists!=null){return exists;}
}
}
返回null;
}

与上面的想法相同,只是在您的情况下,它是与web uri一起使用的,您需要使用递归

这里的想法是继续调用相同的函数,直到没有子函数为止。递归的一个示例是在treelist函数中的FindTreeNode内部:

TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type, Nullable<long> id)
{
    foreach (var c in node.Nodes) 
    {
        if ((Enumerations.ItemType)c[2] == type &&
           (id == null || (long)c[0] == id.Value)) {

            return c;
        }

        if (c.HasChildren) 
        {
            // Here is the secret sauce
            // This is recursion
            var exists = FindTreeNode(c, type, id);
            if (exists != null) { return exists; }
        }
    }
    return null;
}
TreeListNode FindTreeNode(TreeListNode节点,Enumerations.ItemType类型,可空id)
{
foreach(node.Nodes中的var c)
{
if((Enumerations.ItemType)c[2]==类型&&
(id==null | |(long)c[0]==id.Value)){
返回c;
}
如果(c.有子女)
{
//这是秘方
//这是递归
var exists=FindTreeNode(c,type,id);
如果(exists!=null){return exists;}
}
}
返回null;
}

与上面的想法相同,只是在你的例子中,它是使用web uri的。

我认为你需要一个递归函数来实现这一点。我认为你需要一个递归函数来实现这一点。它会工作,但它会有意义,对于这种任务来说,编写一些允许并行处理的东西。@Thomas-当然,有一些方法可以让它更快更好,但是这不是问题的目的:)我们只是想帮助OP走出
foreach
地狱!实验上,
并行。foreach()
可能会工作,但它是一个个案基础,没有意义包括在内。我删除了
函数
,它说无法将类型“void”隐式转换为“System.Collections.Generic.List”"@Dawvawd-很抱歉出现跨语言混淆。请将此函数声明为C#中的任何其他函数。代码已更新。对于此类任务来说,编写允许并行处理的内容是可行的,但这是有意义的。@Thomas-当然,有办法使其更快更好,但这不是问题的目的:)我们只是想帮助OP走出地狱!从实验上看,
Parallel.Foreach()
可能会起作用,但这是一个逐案分析的基础,它没有意义包括在内。我删除了
function
,它说“不能隐式地将'void'类型转换为'System.Collections.Generic.List'@Dawvawd-很抱歉跨语言混淆。请将此函数声明为C#中的任何其他函数。代码已更新。