0

右。これはおそらく根本的な間違いですが、まだ見落としています... 以下の最初の関数は、コントロール cbContent2 に文字列を出力します。2 番目は空の文字列を返します。最初の文字列と同じ文字列を返す必要があります。

機能 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 と同じ出力を生成するようにする方法についてのアイデアは素晴らしいでしょう...

4

7 に答える 7

1

変更してみる

getRelatedNews(cat, related, contentTitle);

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

文字列のループでは常に "+=" を避けるようにしてください。それらは不変であるため、ループ内の反復ごとにコピーを作成する必要があります。小さなコレクションの場合、パフォーマンスの低下に気付かないかもしれませんが、大きなコレクションの場合、パフォーマンスに大きな影響を与えます。文字列を作成するために StringBuilder() を使用してみてください。StringBuilder ははるかに効率的です。

于 2011-04-08T02:53:32.950 に答える
0

関連する必要があります += getRelatedNews( ... )

于 2011-04-08T02:45:07.790 に答える
0

文字列は不変です。「+=」を使用して文字列を変更することはできません。

パラメータrelatedを新しい文字列に設定していますが、渡された文字列を変更していません。

于 2011-04-08T02:45:40.063 に答える
0

この問題は (wait for it) に関連していrelatedます。再帰が発生しています。最初の関数では、関数を再帰的に呼び出しており、常に関数の最後に結果をコントロールに連結します (すべての再帰実行で到達)。2 番目では、まだ再帰的に動作していますが、これらの再帰呼び出しからの結果を取得することはありません。文字列は不変でrelatedあり、これらの再帰関数呼び出しによって自動的に更新されることはありません。結果のキャプチャを開始し、評価して、結果が期待どおりかどうかを確認します。

于 2011-04-08T02:47:11.893 に答える
0

関数の呼び出しはどのようになりますか? このようなことをしていますか?

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

その場合は、次のように変更します。

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

この行も変更します

    getRelatedNews(cat, related, contentTitle);

    related += getRelatedNews(cat, related, contentTitle);
于 2011-04-08T02:50:49.990 に答える
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);
 }
于 2011-04-08T15:29:19.997 に答える
0
// this code
     getRelatedNews(cat, related, contentTitle);
// changed to 
     related = getRelatedNews(cat, related, contentTitle);
// works
于 2011-04-11T04:11:27.520 に答える