2011-03-02 126 views
0

如何在results1中获得计算列绿色的results2中的running_total。我的代码如下没有产生所需的结果。谢谢。在计算列上运行总计

num running_total 
----------------- 

0 True 
0 True 
0 True 
0 True 
0 True 
0 True 
0 True 
1 False 
1 False 
1 False 
1 False 
1 False 
0 True 
1 False 
1 False 
1 False 


Sub Main 

    Dim runT1 As integer 

    Dim results1= //some code 

    Dim results2= 
    From v in results1 
    Select New With {.num = v.green, .running_total = (runT1 = runT1 + v.green)} 

    results2.dump() 

End Sub 

回答

0

这已经有一段时间,因为这个问题是问,你很可能现在解决了这一点,但是,万一......

我怀疑你的问题实际上是VB使用“= “既用于布尔比较,也用于赋值。

如果您有:

.running_total = (runT1 = runT1 + v.green) 

VB是处理它同C#代码,上面写着:

.running_total = (runT1 == (runT1 + v.green)) 

我没有在相当一段时间内使用VB.net,但是,如果支持+ =运算符,请尝试使用该运算符,例如

.running_total = (runT1 += v.green) 
2

有许多方法可以解决这个问题,使用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 } 
    ) 

简单,是吧?