2009-07-29 4 views
1

J'ai ce code pour retourner une liste de sources de fonds pour notre organisation. Le problème est que lorsque je parcours le FundSourceList résultant, tout ce qu'il montre est la dernière valeur. Par exemple, si j'ai trois sources de fonds (état, fédéral, athlétique), alors quand j'utilise ce code pour boucler tout ce que je suis listé, c'est athlétique, athlétique, athlétique.Ajout d'éléments à la liste des résultats en double. Quel est le meilleur moyen?

For Each FundSource In FundSources 
     Debug.Print(FundSource.FundDescription) 
    Next 

Donc je change le code à ceci. J'ai déplacé la création de la variable fs à l'intérieur de la boucle.

Dim results = From result In dsResult.Tables(0) Select result 

    Dim FundSourceList As New List(Of FundSource) 



    If results.Count > 0 Then 
     For Each result In results 
      Dim fs As New FundSource 

      fs.FundID = result.Item("strFundID") 
      fs.FundDescription = result.Item("txtFundIDDescr") 
      fs.ShortFundDescription = result.Item("txtFundIDDescrShort") 

      FundSourceList.Add(fs) 

     Next 
    End If 


    Return FundSourceList 

Cela fonctionne bien, mais maintenant je crée une nouvelle classe encore et encore. Cela me semble un peu inefficace. Est-ce que je ne peux pas créer la classe en dehors de la boucle et l'utiliser encore et encore? Merci.

+0

+1 pour la question parce que le sujet est informatif, les balises semblent correctes, et tout est assez clair pour qu'un utilisateur de non-VB.NET (c'est moi) obtienne l'essentiel. – Smandoli

Répondre

0

Vous n'êtes pas en train de créer une classe - la classe est la définition de code pour les méthodes et les propriétés. Lorsque vous utilisez l'opération Nouveau, vous créez une instance de cette classe, ce qui entraîne un objet. Lorsque vous avez une liste d'objets, comme FundSourceList, vous voulez que les éléments qui s'y trouvent soient des objets individuels. Alors oui, la solution que vous avez en bas est correcte. Vous mentionnez des problèmes d'efficacité - lorsque vous instanciez l'objet, tout ce qui se passe (dans ce cas) est de la mémoire allouée pour stocker les variables (et quelques références pour la mémoire gérée, mais vous n'avez pas à vous soucier de cela ici). Ceci est nécessaire et est optimisé sous le capot, donc vous ne devriez pas avoir à vous soucier de cela non plus.

1

Si vous avez 3 sources de fonds, vous avez besoin de trois objets FundSource. C'est aussi simple que ça. Je ne sais pas ce qui est inefficace à ce sujet ...

Comment pouvez-vous ajouter 3 sources de fonds à votre liste, mais en créer une?

0

Vous ne pouvez pas instancier l'objet en dehors de la boucle pour obtenir le résultat souhaité.

Cela est dû au fait que votre objet serait de type référence. Par l'instanciation en dehors de la boucle, vous créeriez une référence à votre objet.

Lorsque vous parcourez vos résultats et définissez les propriétés, vous utilisez cette même référence encore et encore.

Tout ce que vous ajoutez à la liste à chaque itération est la même référence qui, à la fin de la boucle, fera référence à un objet contenant les dernières valeurs de votre jeu de résultats.

En créant de nouveaux objets dans la boucle, vous créez de nouvelles références, chacune pointant vers un nouveau FundSource. Votre boucle écrit maintenant dans un nouvel objet et obtient les résultats souhaités.

Questions connexes