vb.net - 使用 List(Of T).ForEach 方法更新值未按预期工作

标签 vb.net lambda extension-methods anonymous-methods

我有以下代码,

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

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

但是它总是返回 0。我已经检查过,GetPartCost 函数执行并返回一个非零数字,但列表项成本属性从未更新。

该属性只是一个简单的属性,

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

如果我在属性的 Set 中设置断点,它永远不会被命中。

这是怎么回事?

最佳答案

这里的问题是你与赋值的比较令人困惑。

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

这会编译为 x.CostGetPartCost 之间的比较,而不是赋值。原因是 Function (x) 是一个 lambda 表达式,在表达式上下文中使用时 = 是比较而不是赋值。

要解决此问题,请使用语句/Sub 来生成赋值语义

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

注意:Sub lambda 在 Visual Studio 2010 之前不可用。

关于vb.net - 使用 List(Of T).ForEach 方法更新值未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6989014/

相关文章:

java - 是否可以使用 IntStream 向数组添加元素?

c# - 更快的方法来做一个 List<T>.Contains()

c# - ConvertNullDate 扩展方法

c# - Gridview ItemTemplate 的条件逻辑(仅使用标记)

c# - 枚举表达式列表以过滤集合

vb.net - 用于 ANSI 的编码 - vb.net

java - Java 8 中的 lambda 表达式是否执行多线程?

c# - 如何将函数扩展到 Random 类

c# - 以编程方式打开高级安全设置对话框?

vb.net - .net : how to evaluate this error