2011-04-08 3 views
0

Droite. C'est probablement une erreur funadmentale, mais cela me manque toujours ... La première fonction ci-dessous renvoie une chaîne au contrôle cbContent2. La seconde renvoie n'importe quelle chaîne vide - elle doit retourner la même chaîne que la première.La fonction C# ne renvoie pas la chaîne comme prévu

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

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

Je pense que quelque chose va mal dans la différence entre cbContent2.Text + = connexe et retour (liés) - des idées sur la façon de faire Fonction2 produire la même sortie que Function1 serait grand ...

Répondre

0
// this code 
    getRelatedNews(cat, related, contentTitle); 
// changed to 
    related = getRelatedNews(cat, related, contentTitle); 
// works 
0

vous devez aller connexes + = getRelatedNews (...)

+0

dans les deux endroits que vous appelez getRelatedNews .... –

0

Les chaînes sont immuables. Vous ne pouvez pas changer une chaîne en utilisant "+ =".

Vous définissez votre paramètre related à une nouvelle chaîne, mais vous ne changez pas la chaîne qui a été passé.

+0

oui, mais vous pouvez créer une nouvelle chaîne avec l'ancienne chaîne + plus. –

+0

@keith: Vrai, mais l'appelant ne le verra jamais. –

0

Le problème est lié à (l'attendre) related. Vous avez une récursivité qui se passe. Dans la première fonction, vous appelez récursivement la fonction et vous concattez toujours le résultat au contrôle à la fin de la fonction (atteint dans chaque exécution récursive). Dans la seconde, vous continuez d'agir récursivement, mais vous ne capturez jamais le résultat de ces appels récursifs. La chaîne est immuable, related n'est pas mis à jour automatiquement par ces appels de fonction récursifs. Commencez à capturer le résultat et évaluez-le pour voir si les résultats correspondent à vos attentes.

+0

Ok, c'est logique. Mais puisque je suis récursif à travers la fonction entière dans chaque itération, ne va-t-il pas frapper return() et sortir de la boucle quand même? – Nathan

+0

@Nathan, Le 'return' n'affecte que l'exécution actuelle de la fonction, par exemple si vous avez une callstack où' A() 's'appelle, donc vous avez' A() A() 'assis sur la callstack, le retour dans la seconde 'A()' renvoie une valeur et renvoie le contrôle au premier 'A()'. Le premier 'A()' continuera à s'exécuter jusqu'à ce qu'il atteigne son point d'achèvement, puis renvoie une valeur et cède le contrôle à la fonction qui l'a appelé. La question dans l'intervalle est ce que 'A()' fait avec la valeur obtenue par * second * 'A()'? (Et chaque appel récursif suivant.) Dans votre code, la réponse est: rien! –

0

À quoi ressemble l'appel à la fonction? Est-ce que tu fais quelque chose comme ça?

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

Si oui changer à ceci:

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

aussi changer cette ligne

getRelatedNews(cat, related, contentTitle); 

à

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

Essayez de changer

getRelatedNews(cat, related, contentTitle); 

à

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

Vous devriez toujours essayer d'éviter "+ =" dans une boucle avec des cordes. Comme ils sont immuables, vous devez faire une copie pour chaque itération dans la boucle. Pour une petite collection, vous ne remarquerez peut-être pas un hit de performance, mais pour les grandes collections, cela a un impact énorme sur les performances. Essayez d'utiliser StringBuilder() pour créer une chaîne. StringBuilder est beaucoup plus efficace.

0

En fait, le problème est ici:

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