有许多方法可以解决这个问题,使用al基于inq的方法。
如果你使用VB.NET 4.0,那么你可以使用多行lambda表达式,这将给你一个解决方案最接近一个你正在尝试:
Dim runningTotal = 0
Dim getRunningTotal As Func(Of Integer, Integer) = Function(n)
runningTotal += n
Return runningTotal
End Function
Dim results2 =
From v In results1
Select New With { .num = v.green, .running_total = getRunningTotal(v.green) }
的疑难杂症这种方法是如果您不止一次评估result2
查询,则会计算运行总数(即继续从上次计算)。反正你的代码也会发生同样的情况。
在C#中,我会为此创建一个使用迭代器的扩展方法,但此时VB.NET不支持迭代器函数,所以我们必须选择一些更好用的方法。
第一使用Aggregate
& Zip
扩展方法:
Dim results2 =
results1.Zip(
results1.Aggregate(
New Integer() { },
Function(tt, t) _
tt.Concat(New Integer() { tt.LastOrDefault() + t.green }).ToArray()
),
Function (r1, rt) New With { .num = r1.green, .running_total = rt }
)
是的,它的工作,但由于它需要建立连续的中间阵列的源集合中的每个元素是不高效的过分。
最后一种方法是使用由Microsoft的Rx团队生成的System.Interactive
库中的Scan
扩展方法。 Scan
的工作方式与Aggregate
类似,但会自动生成中间值,因此效率更高。
Dim results2 =
results1.Scan(
New With { .num = 0, .running_total = 0 },
Function (tt, t) _
New With { .num = t.green, .running_total = tt.running_total + t.green }
)
或者:
Dim results2 =
results1.Zip(
results1.Scan(0, Function(tt, t) tt + t.green),
Function (r1, rt) New With { .num = r1.green, .running_total = rt }
)
简单,是吧?