【问题标题】:C# function not returning string as expectedC# 函数未按预期返回字符串
【发布时间】:2011-04-08 02:41:59
【问题描述】:

没错。这可能是一个基本错误,但我仍然想念它......下面的第一个函数将一个字符串输出到控件 cbContent2。第二个返回任何空字符串 - 它需要返回与第一个相同的字符串。

功能 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 += related 和 return(related) 之间的差异出了点问题 - 关于如何使 Function2 产生与 Function1 相同的输出的任何想法都将是伟大的......

【问题讨论】:

    标签: c# .net function ektron


    【解决方案1】:

    尝试改变

    getRelatedNews(cat, related, contentTitle);
    

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

    您应该始终尽量避免在字符串循环中使用“+=”。由于它们是不可变的,因此您必须为循环中的每次迭代制作一个副本。对于小型集合,您可能不会注意到性能下降,但对于大型集合,它会对性能产生巨大影响。尝试使用 StringBuilder() 来构建字符串。 StringBuilder 效率更高。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        您正在将参数 related 设置为一个新字符串,但您并没有更改传入的字符串。

        【讨论】:

        • 是的,但您可以使用旧字符串 + 更多内容创建新字符串。
        • @keith:是的,但调用者永远看不到它。
        【解决方案4】:

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

        【讨论】:

        • 好的,有道理。但是由于我在每次迭代中都在遍历整个函数,所以它不会点击 return() 并跳出循环吗?
        • @Nathan, return 只影响当前函数的执行,比如如果你有一个调用栈,其中A() 调用了自己,那么你有A() A() 坐在调用栈上,返回第二个A() 返回一个值并将控制权交还给第一个A()。第一个A() 将继续执行直到它到达它的完成点,然后返回一个值并将控制权交给调用它的任何函数。中间的问题是A() 对它从 second A() 获得的值做了什么? (以及随后的每个递归调用。)在您的代码中,答案是:什么都没有!
        【解决方案5】:

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

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

        如果是这样,请将其更改为:

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

        也改变这一行

            getRelatedNews(cat, related, contentTitle);
        

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

        【讨论】:

          【解决方案6】:

          其实问题出在这里:

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

          【讨论】:

            【解决方案7】:
            // this code
                 getRelatedNews(cat, related, contentTitle);
            // changed to 
                 related = getRelatedNews(cat, related, contentTitle);
            // works
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-03-31
              • 2012-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-08
              相关资源
              最近更新 更多