2011-08-08 1 views
3

J'ai le code suivant,liste à l'aide (de T) Méthode .foreach de mettre à jour les valeurs ne fonctionne pas comme prévu

PB.ForEach(Function(x) x.Cost = GetPartCost(x.PartNumber, x.Units, x.Cost, FB)) 

Return PB.Sum(Function(x) (x.Cost * x.Qty)) 

Cependant, il retourne toujours 0. J'ai vérifié et la fonction GetPartCost exécute et retourne une nombre différent de zéro, mais les propriétés du coût de l'élément de liste ne sont jamais mises à jour.

La propriété est juste une simple propriété,

Public Property Cost() As Double 
    Get 
     Return _Cost 
    End Get 
    Set(ByVal value As Double) 
     _Cost = value 
    End Set 
End Property 

Si je mets un point d'arrêt dans le Set de la propriété, il n'a jamais fait frapper.

Que se passe-t-il?

Répondre

11

Le problème ici est votre comparaison confuse avec l'affectation.

Function(x) x.Cost = GetPartCost ... 

Cette compile jusqu'à une comparaison entre x.Cost et GetPartCost pas une cession. La raison pour laquelle est que Function (x) est une expression lambda et lorsqu'elle est utilisée dans le contexte d'une expression = est une comparaison non affectée.

Pour résoudre ce problème utilisez une instruction/Sub pour produire la sémantique d'affectation

Sub(x) x.Cost = GetPartCost ... 

Note: Sub lambdas ne sont pas disponibles jusqu'à ce que Visual Studio 2010.

+0

Ah, je l'avais remarqué que 'Function' n » ai pas J'ai du sens dans le contexte, mais je n'ai pas pensé à cet opérateur VB '='. – Kratz

Questions connexes