Функция C # не возвращает строку, как ожидалось - PullRequest
0 голосов
/ 08 апреля 2011

правый. Вероятно, это фундаментальная ошибка, но я все еще ее упускаю ... Первая функция ниже выводит строку в элемент управления 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, будут великими ...

Ответы [ 7 ]

1 голос
/ 08 апреля 2011

Попробуйте изменить

getRelatedNews(cat, related, contentTitle);

на

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

Вы всегда должны стараться избегать "+ =" в цикле со строками.Поскольку они являются неизменяемыми, вы должны сделать копию для каждой итерации в цикле.Для небольшой коллекции вы можете не заметить снижения производительности, но для больших коллекций это оказывает огромное влияние на производительность.Попробуйте использовать StringBuilder () для построения строки.StringBuilder гораздо эффективнее.

0 голосов
/ 11 апреля 2011
// this code
     getRelatedNews(cat, related, contentTitle);
// changed to 
     related = getRelatedNews(cat, related, contentTitle);
// works
0 голосов
/ 08 апреля 2011

На самом деле проблема здесь:

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);
 }
0 голосов
/ 08 апреля 2011

Как выглядит вызов функции? Вы делаете что-то подобное?

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

Если это так, измените его на:

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

Также измените эту строку

    getRelatedNews(cat, related, contentTitle);

до

    related += getRelatedNews(cat, related, contentTitle);
0 голосов
/ 08 апреля 2011

Проблема связана с (подождите) related. У вас происходит рекурсия В первой функции вы рекурсивно вызываете функцию и всегда объединяете результат с элементом управления в конце функции (достигается при каждом рекурсивном выполнении). Во-вторых, вы все еще действуете рекурсивно, но никогда не получаете результат от этих рекурсивных вызовов. Строка неизменна, related не обновляется этими рекурсивными вызовами функций автоматически. Начните фиксировать результат и оцените его, чтобы увидеть, соответствуют ли результаты ожидаемым.

0 голосов
/ 08 апреля 2011

Строки неизменны.Вы не можете изменить строку с помощью «+ =».

Вы устанавливаете свой параметр related на новую строку, но не изменяете строку, которая была передана.

0 голосов
/ 08 апреля 2011

вам нужно перейти на родство + = getRelatedNews (...)

...