动态统计相似类型的数据

时间:2013-06-26 11:55:52

标签: asp.net vb.net dynamic foreach dataset

我在VB页面中有一个包含批量数据的数据表。在该数据表中,一列命名为vType,该列中的值是Pr定义的值之一,如'A','B','C', 'D'等,来自一个Datable。 现在我想要最后计算每种类型。 例如:CountA = 20,CountB = 25,依此类推。

到目前为止,我已使用If条件(静态

)比较了每个值
For each dr as dataRow in dsType.rows
If dr("vType") = 'A' Then
                    CountA += 1
ElseIf dr("vType") = 'B' Then
                    CountB +=1
Next dr

并且这个if条件将重复取决于该数据表中的类型没有(最多8个固定值)我想在单个if条件下执行此操作(如果可能,则为Dynamic)我可以计算这些值并将其存储为单个值varaible?感谢您及时回复。

3 个答案:

答案 0 :(得分:1)

您可以在每个群组中使用Linq-To-DataSetEnumerable.GroupBy + Enumerable.Count

Dim typeGroups = dsType.AsEnumerable().
    GroupBy(Function(row) row.Field(Of String)("vType")).
    Select(Function(g) New With{ .Type = g.Key, .Count = g.Count(), .TypeGroup = g })

请注意New With在VB.NET中使用自定义属性创建匿名类型。所以就像你可以在当前方法中使用的 on the the-fly 类。

现在,您可以使用For Each枚举查询:

For Each typeGroup In typeGroups
    Console.WriteLine("Type:{0} Count:{1}", typeGroup.Type, typeGroup.Count)
Next

  

我不能使用Linq,我只需要使用简单的vb

然后使用Dictionary

Dim typeCounts = New Dictionary(Of String, Integer)
For Each row As DataRow In dsType.Rows
    Dim type = row.Field(Of String)("vType")
    If (typeCounts.ContainsKey(type)) Then
        typeCounts(type) += 1
    Else
        typeCounts.Add(type, 1)
    End If
Next

现在您有一个字典,其中键是类型,值是具有此类型的行的计数。

答案 1 :(得分:0)

为什么不从db本身获取假装结果? 像这样:

select count(*), vType
from someTable
group by vType

答案 2 :(得分:0)

对你的问题不太确定..但这是我考虑过的......

您可以将其设为Sub ..

Sub AssignIncr(ByVal ds as DataSet,byval sFi as String,byval sCrit as String,ByRef Counter as Integer)
  For each dr as dataRow in ds.rows
    If dr(sFi) = sCrit Then Counter += 1
  Next dr
End Sub

所以你可以通过..

来使用它
AssignIncr(dsType,"vType","A",CountA)