C#函数没有像预期的那样返回字符串
没错。这可能是一个真正的错误,但我仍然错过了......下面的第一个函数向控件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相同的输出将会成为...
// this code
getRelatedNews(cat, related, contentTitle);
// changed to
related = getRelatedNews(cat, related, contentTitle);
// works
在你打电话getRelatedNews这两个地方....
你需要去相关+ = getRelatedNews(...)
字符串是不可变的。您无法使用“+ =”更改字符串。
你是你的参数设置related
到一个新的字符串,但你不改变中传递的字符串。
是 – 2011-04-08 02:47:28
@keith:确实,但来电者永远不会看到它。 – 2011-04-08 15:34:10
的问题是有关(等待它)related
。你有递归发生。在第一个函数中,您正在递归调用该函数,并且始终将结果连接到函数结尾处的控件(在每次递归执行中到达)。在第二种情况下,您仍然以递归方式进行操作,但您永远不会从这些递归调用中捕获结果。该字符串是不可变的,related
不会被这些递归函数调用自动更新。开始捕获结果并对结果进行评估,看看结果是否符合您的期望。
好的,这是有道理的。但是,由于我在每次迭代中遍历整个函数,是不是会返回return()并跳出循环呢? – Nathan 2011-04-08 03:26:36
@Nathan,'return'只影响当前的函数执行,比如你有一个调用堆栈,其中'A()'自己调用,所以你有'A()A()'坐在callstack上,返回第二个'A()'返回一个值并返回第一个'A()'的控制权。第一个'A()'将继续执行,直到达到它的完成点,然后返回一个值并将控制权交给任何调用它的函数。在这个过渡期中的问题是'A()'用从第二个* A()中得到的值做什么? (和每个后续的递归调用。)在你的代码中,答案是:什么都没有! – 2011-04-08 04:22:04
对函数的调用是什么样的?你在做这样的事吗?
string blah = getRelatedNews(x, "", y);
如果因此它改成这样:
string buffer,blah = getRelatedNews(x, buffer, y);
也会改变该行
getRelatedNews(cat, related, contentTitle);
到
related += getRelatedNews(cat, related, contentTitle);
尝试改变
getRelatedNews(cat, related, contentTitle);
到
related += getRelatedNews(cat, related, contentTitle);
您应尽量避免 “+ =” 在用绳子一环。由于它们是不可变的,你必须为循环中的每个迭代制作一个副本。对于一个小型系列,您可能没有注意到性能受到影响,但对于大型系列,它对性能有很大的影响。尝试使用StringBuilder()来构建一个字符串。 StringBuilder更有效率。
其实问题就在这里:
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);
}
,但你可以创建一个旧字符串+更多的新字符串。 – 2011-04-08 02:51:36