2011-04-08 162 views
0

没错。这可能是一个真正的错误,但我仍然错过了......下面的第一个函数向控件cbContent2输出一个字符串。第二个返回任何空字符串 - 它需要返回与第一个字符串相同的字符串。C#函数没有像预期的那样返回字符串

功能1

private void getRelatedNews(TaxonomyData taxData, string related, string contentTitle) 
{ 
    foreach (TaxonomyItemData item in taxData.TaxonomyItems) 
    { 
     if (taxData.TaxonomyName.Equals(contentTitle) && taxData.TaxonomyItemCount != 0) 
     { 
      related += string.Format("<li><a href='{0}'\">{1}</a></li>", item.TaxonomyItemId.ToString(), item.TaxonomyItemId.ToString()); 
     }     
    } 
    // Show all its sub categories 
    foreach (TaxonomyData cat in taxData.Taxonomy) 
    { 
     getRelatedNews(cat, related, contentTitle); 
    } 
    cbContent2.Text += related; 
} 

功能2

private string getRelatedNews(TaxonomyData taxData, string related, string contentTitle) 
{ 
    foreach (TaxonomyItemData item in taxData.TaxonomyItems) 
    { 
     if (taxData.TaxonomyName.Equals(contentTitle) && taxData.TaxonomyItemCount != 0) 
     { 
      related += string.Format("<li><a href='{0}'\">{1}</a></li>", item.TaxonomyItemId.ToString(), item.TaxonomyItemId.ToString()); 
     }     
    } 
    // Show all its sub categories 
    foreach (TaxonomyData cat in taxData.Taxonomy) 
    { 
     getRelatedNews(cat, related, contentTitle); 
    } 
    return(related); 
} 

我觉得东西之间的差异是怎么了?cbContent2.Text + =相关和回归(相关) - 如何使任何想法Function2产生与Function1相同的输出将会成为...

回答

0
// this code 
    getRelatedNews(cat, related, contentTitle); 
// changed to 
    related = getRelatedNews(cat, related, contentTitle); 
// works 
在你打电话getRelatedNews这两个地方....
0

你需要去相关+ = getRelatedNews(...)

+0

,但你可以创建一个旧字符串+更多的新字符串。 – 2011-04-08 02:51:36

0

字符串是不可变的。您无法使用“+ =”更改字符串。

你是你的参数设置related到一个新的字符串,但你不改变中传递的字符串。

+0

是 – 2011-04-08 02:47:28

+0

@keith:确实,但来电者永远不会看到它。 – 2011-04-08 15:34:10

0

的问题是有关(等待它)related。你有递归发生。在第一个函数中,您正在递归调用该函数,并且始终将结果连接到函数结尾处的控件(在每次递归执行中到达)。在第二种情况下,您仍然以递归方式进行操作,但您永远不会从这些递归调用中捕获结果。该字符串是不可变的,related不会被这些递归函数调用自动更新。开始捕获结果并对结果进行评估,看看结果是否符合您的期望。

+0

好的,这是有道理的。但是,由于我在每次迭代中遍历整个函数,是不是会返回return()并跳出循环呢? – Nathan 2011-04-08 03:26:36

+0

@Nathan,'return'只影响当前的函数执行,比如你有一个调用堆栈,其中'A()'自己调用,所以你有'A()A()'坐在callstack上,返回第二个'A()'返回一个值并返回第一个'A()'的控制权。第一个'A()'将继续执行,直到达到它的完成点,然后返回一个值并将控制权交给任何调用它的函数。在这个过渡期中的问题是'A()'用从第二个* A()中得到的值做什么? (和每个后续的递归调用。)在你的代码中,答案是:什么都没有! – 2011-04-08 04:22:04

0

对函数的调用是什么样的?你在做这样的事吗?

string blah = getRelatedNews(x, "", y); 

如果因此它改成这样:

string buffer,blah = getRelatedNews(x, buffer, y); 

也会改变该行

getRelatedNews(cat, related, contentTitle); 

related += getRelatedNews(cat, related, contentTitle); 
1

尝试改变

getRelatedNews(cat, related, contentTitle); 

related += getRelatedNews(cat, related, contentTitle); 

您应尽量避免 “+ =” 在用绳子一环。由于它们是不可变的,你必须为循环中的每个迭代制作一个副本。对于一个小型系列,您可能没有注意到性能受到影响,但对于大型系列,它对性能有很大的影响。尝试使用StringBuilder()来构建一个字符串。 StringBuilder更有效率。

0

其实问题就在这里:

private string getRelatedNews(TaxonomyData taxData, string related, string contentTitle) 
{ 
    foreach (TaxonomyItemData item in taxData.TaxonomyItems) 
    { 
     if (taxData.TaxonomyName.Equals(contentTitle) && taxData.TaxonomyItemCount != 0) 
     { 
       related += string.Format("<li><a href='{0}'\">{1}</a></li>", item.TaxonomyItemId.ToString(), item.TaxonomyItemId.ToString()); 
     }     
    } 
    // Show all its sub categories 
    foreach (TaxonomyData cat in taxData.Taxonomy) 
    { 
    // this code 
     getRelatedNews(cat, related, contentTitle); 
    // should be changed to 
     related += getRelatedNews(cat, related, contentTitle); 
    } 
    return(related); 
}