2011-04-08 122 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); 
}