如何在Linq中处理除零

时间:2011-04-27 08:55:41

标签: vb.net linq linq-to-objects divide-by-zero

在下面的linq查询中,我有一个除零异常,我似乎无法编码。它发生在fldDevider的Sum返回0时。

Dim lstToReturn As List(Of MonthData)

lstToReturn = (
 From myRow In dtSpotData.AsEnumerable()
 Group myRow By myRow.Field(Of DateTime)(fldstartdate).Month Into Group
 Select New MonthData() With {
 .Month = Month,
 .ValuePerMonth =
 (
  Group.Sum(Function(dr) dr.Field(Of [Decimal])(fldSomeGeneralValue)) /
  (
   Group.Sum(Function(dr) CDec(dr.Field(Of String)(fldDevider)))
  )
 )
 }
).ToList()

当Group.Sum(Function(dr)CDec(dr.Field(Of String)(fldDevider)))函数返回0时,如何确保ValuePerMonth字段为0.或者如何返回1为如果它实际上是0,则求和fldDevider。

有关如何更好地从字符串转换为小数的一些提示也很受欢迎。

1 个答案:

答案 0 :(得分:3)

我习惯使用C#语法,但我会使用'let'来捕获除数的值,只有在大于零的情况下才使用它,否则使用1。

Dim lstToReturn As List(Of MonthData)

lstToReturn = (
 From myRow In dtSpotData.AsEnumerable()
 Group myRow By myRow.Field(Of DateTime)(fldstartdate).Month Into Group
 Let div = Group.Sum(Function(dr) CDec(dr.Field(Of String)(fldDevider)))
 Select New MonthData() With {
 .Month = Month,
 .ValuePerMonth =
 (
  Group.Sum(Function(dr) dr.Field(Of [Decimal])(fldSomeGeneralValue)) / If(div > 0, div, 1)
 )
 }
).ToList()